我正在使用带有Java的Hibernate 3.0。
我有以下课程。
Teacher.java
private long id;
private String teacherName;
private List<Student> students;
// getter-setter of all
Subject.java
private long id;
private String subjectName;
private List<Student> students;
// getter-setter of all
Student.java
private long id;
private String studentName;
// getter-setter of both
Teacher.hbm.xml
<class name="Teacher" table="teacher_master">
<!--other mappings-->
<list name="students" cascade="refresh" table="teacher_student_master">
<key column="teacher_id"/>
<index column="student_teacher_position" type="integer"/>
<many-to-many class="Student" column="student_id"/>
</list>
</class>
Subject.hbm.xml
<class name="Subject" table="subject_master">
<!--other mappings-->
<list name="students" cascade="refresh" table="subject_student_master">
<key column="subject_id"/>
<index column="student_subject_position" type="integer"/>
<many-to-many class="Student" column="student_id"/>
</list>
</class>
Student.hbm.xml 包含 id &amp;的映射 studentName 属性。
我面临的问题是:
我通过Hibernate从 student_master 中删除了一行。
Student stu = new Student();
stu.setId(1l);
session.delete(stu);
transaction.commit();
但已删除的学生(id = 1)的引用不会从表 teacher_student_master 和 subject_student_master 中删除。
我如何克服这个问题?
注意:如果我可以通过使用Hibernate进行某种配置而不是编码和放大来解决这个问题,那就太棒了。查询解雇。
编辑:我见过这个link。但是在那里,提到我需要做一些编码,首先让所有与student = 1相关联的教师,然后从student&amp;列表中删除student = 1。然后更新老师。我想避免这种编码。有可能吗?
答案 0 :(得分:0)
您可以将@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)用于您希望此行为的列。有关详细信息,请参阅this question。
或者,由于您通过XML使用Hibernate配置,因此请使用cascade =“delete-orphan”。看看this blog post,其中解释了不同类型的级联。
答案 1 :(得分:0)
在两个映射文件中使用cascade="delete"
属性。它可能会解决您的问题。如果要分配“刷新”,则使用;
指定多个属性进行级联。
答案 2 :(得分:0)
Hibernate不会删除行,因为Student类不知道这些关系。要做到这一点,你应该有双向关系:@ManyToMany列表/教师集和学生班的@ManyToMany列表/主题集
或者,至少,表teacher_student_master和subject_student_master的外键student_id上的数据库删除级联将删除数据库中的行(我认为第一种解决方案更好)。
但是,无论如何,你应该迭代学生的科目和老师来删除这个学生,即使在数据库中删除了该行,学生对象仍然在那里,它可能会引发一些问题你的应用程序...一般来说,在使用Hibernate保存之前要处理关系(双方)
双向关系更容易
for(Teacher teacher: student.teachers) {
teacher.remove(student);
}
for(Subject subject: student.subjects) {
subject.remove(student);
}