1

我在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 
} 

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

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

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

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

回答

0

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

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

+0

而且orphanRemoval = true属性应该加 – mstzn

+0

是的!这看起来不错。但还有另一个问题。班主任有一个属性@ManyToMany私人清单课程;然后,我不能改变Course.class的结构;我的意思是,如果我想访问一个教师是T的主题,我只需编写T.getCourse()。get(0).getSubject()。getName();所以,如果我按照你说的方式改变课程,我将如何获得教师T的科目? – Quarktum

+0

我还没有说修改课程的任何内容(变量命名除外) - 所以老师对主题的访问可以保持不变。 – kostja