hibernate许多对多关系更新意外

时间:2014-04-26 07:21:37

标签: java hibernate

我有两个班级:

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的东西。我不确定这是否与此相关。

我只是用它作猜测而且它正在发挥作用。此外,这似乎是一个多对多的关系,即同一个班级可以属于许多课程,一个课程可以包括许多班级。但一对多的关系也在起作用。这不是很有说服力。培训班真的不知道培训课程包含哪些内容。看起来一对多和多对多之间的差异就像是否有彼此的双向指针。

因此,请建议上述方法是否正确,以防止在创建培训课程时更新培训课程。

由于

1 个答案:

答案 0 :(得分:0)

您的第一个映射使用cascade = ALL。这意味着您在TrainingCourse上进行的每项操作(持久,合并,删除等)也将应用于相关的TrainingClass。如果我理解正确的话,这正是你不想要的。所以,不要为此协会设置任何级联。

关于OneToMany与ManyToMany:如果你真正想要的是OneToMany(即TraningClass不应该与多个TrainingCourse相关联),那么你应该在TrainingCourseClass.ClassID列上有一个独特的约束。这保证了该协会是OneToMany而不是ManyToMany。