6

我正在使用带有 Java 的 Hibernate 3.0。

我有以下课程。

教师.java

private long id;
private String teacherName;
private List<Student> students;
// getter-setter of all

主题.java

private long id;
private String subjectName;
private List<Student> students;
// getter-setter of all

学生.java

 private long id;
 private String studentName;

// getter-setter of both

教师.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>

主题.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包含idstudentName属性的映射。

我面临的问题是:

我通过 Hibernate从student_master中删除了一行。

Student stu = new Student();
stu.setId(1l);
session.delete(stu);
transaction.commit();

但是已删除学生 (id = 1)的引用不会从表teacher_student_mastersubject_student_master中删除。

我该如何克服这个问题?

注意:如果我可以通过使用 Hibernate 进行某种配置而不是编码和查询触发来克服这个问题,那就太好了。

编辑:我看过这个链接。但是在那,它提到我需要做一些编码,首先获取与 student=1 关联的所有教师,然后从学生列表中删除 student=1,然后更新教师。我想避免这种编码。可能吗?

4

3 回答 3

0

您可以将 @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 用于您想要此行为的列。有关更多信息,请参阅此问题

或者,由于您通过 XML 使用 Hibernate 配置,请使用 cascade="delete-orphan"。看看这篇博客文章,其中解释了不同类型的级联。

于 2013-08-22T13:17:54.050 回答
0

cascade="delete"在两个映射文件中使用属性。它可能会解决您的问题。如果要分配“刷新”,则使用;.

于 2013-08-22T13:18:09.340 回答
0

Hibernate 不会删除行,因为 Student 类不知道这些关系。为此,您应该具有双向关系:@ManyToMany List/Set of Teacher 和 @ManyToMany List/Set of Subject in the Student 类

或者,至少,表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);
}
于 2015-04-10T15:38:47.083 回答