Как удалить строку и все ее ссылки из базы данных через Hibernate?

Я использую Hibernate 3.0 с Java.

У меня есть следующие классы.

Teacher.java

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

Subject.java

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

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 column="student_id">
 </many-to-many></index></key></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 column="student_id">
 </many-to-many></index></key></list>
</class>

Student.hbm.xml содержит сопоставления для свойств id и studentName.

Проблема, с которой я сталкиваюсь:

Я удаляю строку из student_master через Hibernate.

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

Но ссылки удаленных учеников (id = 1) не удаляются из таблиц teacher_student_master и subject_student_master.

Как я могу решить эту проблему?

Примечание. Было бы здорово, если бы я смог преодолеть эту проблему, выполнив какую-то конфигурацию с Hibernate вместо кодирования и запроса.

Изменить: я видел эту ссылку . Но в этом он упомянул, что мне нужно сделать некоторую кодировку, например, сначала получить всех учителей, связанных с учеником = 1, а затем удалить ученика = 1 из списка учеников, а затем обновить учителя. Я хочу избежать этого кодирования. Возможно ли это?

3 ответа

Hibernate не удаляет строки, потому что класс Student не знает об отношениях. Для этого вам необходимо иметь двунаправленные отношения: список @ManyToMany/набор преподавателей и список @ManyToMany/набор объектов в классе Student

Или, по крайней мере, каскад удаления базы данных на внешнем ключе student_id из таблиц teacher_student_master и subject_student_master удалит строки в базе данных (я думаю, что первое решение лучше).

Но в любом случае вы должны перебирать студентов и преподавателей для удаления этого ученика, даже если строка удалена в базе данных, объект-ученик все еще существует, и это может вызвать некоторые проблемы в вашем приложении. Вообще говоря, берегите отношения (обе стороны) перед сохранением с Hibernate

С двунаправленным отношением проще

for(Teacher teacher: student.teachers) {
 teacher.remove(student);
}
for(Subject subject: student.subjects) {
 subject.remove(student);
}


Вы можете использовать @Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN) для столбцов, которые вы хотите этого поведения. См. этот вопрос для получения дополнительной информации.

Или, поскольку вы используете конфигурацию Hibernate через XML, используйте cascade = "delete-orphan". Взгляните на этот пост в блоге, где объясняются различные типы каскадов.


Использовать свойство cascade="delete" в обоих файлах сопоставления. Это может решить вашу проблему. Если вы хотите назначить "обновить", тогда для каскадирования присваивается несколько свойств с помощью ;.

licensed under cc by-sa 3.0 with attribution.