2017-02-20 16 views
0

У меня возникла проблема с вызовом репозитория атрибуту объекта, который является частью отношения 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); 
    } 

Я пробовал несколько вещей, но я не могу заставить его работать. У вас есть идея, почему я столкнулся с этим? Я хотел бы сделать это, потому что хочу, чтобы преподаватели курса были разбиты на страницы.

спасибо.

+0

Не могли бы вы написать код, вызывающий 'findAllByCourses'? Кроме того, я настоятельно рекомендую использовать 'CascadeType.ALL' (что подразумевает' CascadeType.REMOVE') во многих отношениях ко многим * – crizzis

+0

Вы правы в CASCADE.ALL. Спасибо. О коде для этого метода я не могу опубликовать его, потому что он создан Spring JPA. Он использует свой синтаксис метода запроса и строит запрос на основе метода. Я использовал подобный подход для CoursesRepository.И метод работает очень хорошо, поэтому я думаю, что есть проблема с отношениями или некоторыми аннотациями. –

+0

Я имел в виду код, который его использует, а не реализация – crizzis

ответ

1

Попробуйте изменить findAllByCourses на номер findAllByCoursesId с идентификатором курса в качестве параметра.

findAllByCourses было бы прекрасно, если вызывается из транзакции, а аргумент course является управляемым объектом. Однако в вашем коде он вызывается с сущностью, которая не управляется JPA (поскольку она собирается modelMapper.map(course, Course.class) и никогда не объединяется в контекст персистентности). По-видимому, JPA это не нравится.

Решение просто не использует методы поиска с отдельными объектами в качестве параметров запроса.

+0

Отлично. Большое спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^