2017-02-20 57 views
0

我有一個庫調用對象的屬性,它是一個Many-To-Many關係的一部分問題。Java的春天 - 多對多調用錯誤 - 對象引用一個未保存的瞬態的實例

我試圖讓分配給特定課程的講師全部(讓所有的課程特定講師的作品非常好)。但是,當我打電話從倉庫下面的方法我得到的 錯誤:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: app.model.Course

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; 

    ... 
} 

講師庫

public interface LecturerRepository extends PagingAndSortingRepository<Lecturer, Long> { 

    ... 

    Page<Lecturer> findAllByCourses(Course course, Pageable pageable); 

} 

被修改

場服務方法

@Override 
    public Page<Lecturer> getLecturers(Course course, int page) { 
     return lecturers.findAllByCourses(course, new PageRequest(page, 10)); 
    } 

編輯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

嘗試改變findAllByCoursesfindAllByCoursesId與課程ID作爲參數。

findAllByCourses如果從事務中調用並且參數course是託管實體,則將會非常好。然而,在你的代碼中,它是用一個不由JPA管理的實體調用的(因爲它由modelMapper.map(course, Course.class)組裝,永遠不會合併到持久化上下文中)。顯然,JPA不喜歡這樣。

解決方法是不使用取景器中的方法分離的實體作爲查詢參數。

+0

太棒了。非常感謝。 –

相關問題