簡體   English   中英

休眠多對多關系意外更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM