У меня возникла проблема с вызовом репозитория атрибуту объекта, который является частью отношения Many-To-Many
.Java Spring - ManyToMany Call Error - ссылки на объекты несохраненного экземпляра переходного процесса
Я стараюсь, чтобы все лекторы были назначены на определенный курс (все курсы для конкретного лектора работают очень хорошо). Но когда я вызываю метод из репозитория ниже я получаю сообщение об ошибке:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: app.model.Course
The CascadeType
устанавливается для обеих частей отношений.
У меня есть следующая конфигурация:
преподаватель
@Entity
@Table(name = "LECTURERS")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Lecturer extends AbstractUser {
@ManyToMany(fetch = FetchType.EAGER, targetEntity = Course.class, cascade = CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JoinTable(name = "COURSE_OWNERSHIPS",
joinColumns = {@JoinColumn(name = "lecturer_id")},
inverseJoinColumns = {@JoinColumn(name = "course_id")})
@JsonSerialize(using = CustomCourseListSerializer.class)
private List<Course> courses = new ArrayList<>();
...
}
курс
@Entity
@Table(name = "COURSES")
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Course implements Item, Serializable {
...
@ManyToMany(mappedBy = "courses", fetch = FetchType.EAGER, targetEntity = Lecturer.class, cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SUBSELECT)
@JsonSerialize(using = CustomLecturerListSerializer.class)
private List<Lecturer> lecturers;
...
}
преподаватель Repository
public interface LecturerRepository extends PagingAndSortingRepository<Lecturer, Long> {
...
Page<Lecturer> findAllByCourses(Course course, Pageable pageable);
}
Метод Edited
Услуги Курс
@Override
public Page<Lecturer> getLecturers(Course course, int page) {
return lecturers.findAllByCourses(course, new PageRequest(page, 10));
}
Edit 2
метод Полный сервис курс
@Override
public Page<LecturerDto> getLecturers(CourseDto course, int page) {
Type listType = new TypeToken<Page<LecturerDto>>() {}.getType();
return modelMapper.map(lecturers.findAllByCourses(modelMapper.map(course, Course.class), new PageRequest(page, 10)), listType);
}
Я пробовал несколько вещей, но я не могу заставить его работать. У вас есть идея, почему я столкнулся с этим? Я хотел бы сделать это, потому что хочу, чтобы преподаватели курса были разбиты на страницы.
спасибо.
Не могли бы вы написать код, вызывающий 'findAllByCourses'? Кроме того, я настоятельно рекомендую использовать 'CascadeType.ALL' (что подразумевает' CascadeType.REMOVE') во многих отношениях ко многим * – crizzis
Вы правы в CASCADE.ALL. Спасибо. О коде для этого метода я не могу опубликовать его, потому что он создан Spring JPA. Он использует свой синтаксис метода запроса и строит запрос на основе метода. Я использовал подобный подход для CoursesRepository.И метод работает очень хорошо, поэтому я думаю, что есть проблема с отношениями или некоторыми аннотациями. –
Я имел в виду код, который его использует, а не реализация – crizzis