【问题标题】:Remove object with relationships - Hibernate删除具有关系的对象 - 休眠
【发布时间】:2014-01-14 08:31:06
【问题描述】:

我在 Hibernate 关系和 Save-Update-Delete 方面遇到了一些问题。假设我有以下内容:

 public class Subject{
      @Id
      private int ID;
      private String Name;
      //getters and setters
 }


 public class Grade{
      @Id
      private int ID;
      private String Name;
      //getters and setters
 }


 public class Course{
      @Id
      private int ID;
      @ManyToOne
      private Grade G;
      @ManyToOne
      private Subject S;
      //getters and setters
 }


 public class Teacher extends User{
      @ManyToMany
      List<Course> Courses = new ArrayList<Course>();
      //...
      //getters and setters
 }

问题是,我不能简单地删除一个主题,因为它有关系。 我的意思是,当我删除一个主题时,所有具有该主题的课程也必须被删除。而且,如果删除了课程,则“属于”该课程的主题应该存在。成绩和课程也是如此。

我的解决方案(暂时)是: 删除 Subject 的方法,在删除 Subject 本身之前调用删除所有具有该主题的 Courses 的方法。

但我确信这不是正确的方法。我知道 CascadeType 应该可以解决这个问题,但我不知道该使用哪个,也不知道何时使用。

现在我们在谈论 Hibernate,所有关系都应该是双向的吗?

【问题讨论】:

    标签: hibernate entity-relationship cascade bidirectional-relation


    【解决方案1】:

    Course 实体被 3 个实体引用,并不总是拥有方。在这种情况下,您根本不应该使用级联。在这种级联删除之后,该关系将处于不一致的状态。

    级联很好,当两个实体具有一对多关系时,但对于更多实体和多对多关系(以及多对一关系的多方),您必须“手动”完成。

    【讨论】:

    • 并且应该添加 orphanRemoval=true 属性
    • 是的!这看起来是对的。但是还有另一个问题。 Teacher 类有一个属性 @ManyToMany private List Course;然后,我不能改变 Course.class 的结构;我的意思是,如果我想访问教师为 T 的主题,我只需编写 T.getCourse().get(0).getSubject().getName();那么,如果我按照你说的方式更改课程,我将如何访问 T 老师的主题?
    • 我没有说任何关于修改 Course 类的内容(变量命名除外)——所以老师对主题的访问可以保持不变。
    • 是否使用级联的问题高度依赖于实体拥有的关系的数量和类型。您不能明智地在多对多关系中级联。您能否将教师实体添加到您的问题中 - 它会改变答案。
    • 我已将教师课程添加到问题中。我想我会回答“手动执行,因为涉及的实体超过 2 个”。太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多