[英]hibernate many-to-many relationship updating unexpectingly
我有兩節課:
class TrainingCourse {
Integer id;
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name = "TrainingCourseClass", joinColumns = { @JoinColumn(name = "CourseID") }, inverseJoinColumns = { @JoinColumn(name = "ClassID") })
private Set<TrainingClass> trainingClasses;
}
class TrainingClass {
Integer id;
}
在數據庫中,它們使用聯接表進行映射。 因此,這是單向關系。
從UI中,當創建TrainingCourse時,將從UI中選擇以前創建的TrainingClasses的列表。
現在,如果我創建了TrainingCourse,那么它也會自動更新關聯的TrainingClasses。 但是trainingClass獨立於TrainingCourse,可以獨立存在。 因此,TrainingClasses是與TrainingCourse分開創建和更新的。 因此,保存TrainingCourse應該將數據保存在TrainingCourse表中,並將關聯也保存在聯接表TrainingCourseClass中。 表TrainingClass中什么也不會發生。
但是,如果我將這些添加到列中:
nullable=false, updatable=false and CascadeType.REMOVE
@OneToMany(cascade = CascadeType.REMOVE, fetch=FetchType.EAGER)
@JoinTable(name = "TrainingCourseClass", joinColumns = { @JoinColumn(name = "CourseID", nullable=false, updatable=false) }, inverseJoinColumns = { @JoinColumn(name = "ClassID", nullable=false, updatable=false) })
private Set<TrainingClass> trainingClasses;
然后問題解決了,即創建trainingCourse不會更新trainingClass表。 現在,我不確定100%是正確的解決方案還是解決問題的方法。 還有另一件事叫做MappedBy。 我不確定這是否與此有關。
我只是將其用作猜測,並且它正在工作。 而且,這似乎確實是多對多的關系,即同一課程可以屬於許多課程,而一個課程可以包含許多課程。 但是,一對多關系也在起作用。 這不是很令人信服。 培訓班實際上並不知道其中包括哪些培訓課程。 似乎一對多和多對多之間的區別就像是否具有雙向指針。
因此,請提出上述方法是否正確,以防止在創建培訓課程時更新培訓課程。
謝謝
您的第一個映射使用cascade = ALL
。 這意味着您對TrainingCourse進行的每個操作(持續,合並,刪除等)也將應用於關聯的TrainingClass。 如果我理解正確,那正是你所不想要的。 因此,請勿對此關聯設置任何級聯。
關於OneToMany與ManyToMany:如果您真正想要的是OneToMany(即,一個TraningClass不應與一個以上TrainingCourse相關聯),那么您在TrainingCourseClass.ClassID
列上應該有一個唯一的約束。 這就是保證該關聯是OneToMany而不是ManyToMany的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.