删除具有关系的对象-Hibernate

删除具有关系的对象-Hibernate,hibernate,entity-relationship,cascade,bidirectional-relation,Hibernate,Entity Relationship,Cascade,Bidirectional Relation,我在Hibernate关系和保存更新删除方面遇到一些问题。假设我有以下几点: public class Subject{ @Id private int ID; private String Name; //getters and setters } 问题是,我不能简单地删除一个主题,因为它有关系。 我的意思是,当我删除一个科目时,所有有该科目的课程也必须删除。而且,如果一门课程被删除,属于该课程的科目应该存在。成绩和课程也是如此 我的解决办

我在Hibernate关系和保存更新删除方面遇到一些问题。假设我有以下几点:

 public class Subject{
      @Id
      private int ID;
      private String Name;
      //getters and setters
 }
问题是,我不能简单地删除一个主题,因为它有关系。 我的意思是,当我删除一个科目时,所有有该科目的课程也必须删除。而且,如果一门课程被删除,属于该课程的科目应该存在。成绩和课程也是如此

我的解决办法是: 删除主题的方法调用在删除主题之前删除所有具有该主题的课程的方法

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


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

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


级联很好,当两个实体具有一对多关系时,但对于更多实体、多对多关系以及多对一关系的多方面,您必须“手动”执行此操作。

且orphanRemove=true属性应为addYes!看起来不错。但还有另一个问题。班主任有一个属性@manytomy private List Course;那么,我不能改变课程的结构;我的意思是,如果我想访问一个老师是T的科目,我只需写T.getCourse.get0.getSubject.getName;所以,如果我按照你说的方式改变课程,我如何访问教师T的主题?除了变量命名之外,我没有说过任何关于修改课程类的内容-因此教师对主题的访问可以保持不变。是否使用级联的问题取决于实体具有的关系的数量和类型。您不能在多对多关系中进行合理的级联。你能把教师实体添加到你的问题中吗?它会改变答案。我已经把教师类添加到了问题中。我想我会用手工来回答,因为涉及的实体不止两个。太多了!
 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
 }