如何删除一行&它通过Hibernate从数据库中引用它的所有内容?

时间:2013-08-22 13:12:57

标签: java sql sql-server-2008 hibernate hibernate-mapping

我正在使用带有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。然后更新老师。我想避免这种编码。有可能吗?

3 个答案:

答案 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);
}