2013-08-22 15 views
6

Tôi đang sử dụng Hibernate 3.0 với Java.Làm thế nào để xóa một hàng và tất cả các tham chiếu của nó từ cơ sở dữ liệu thông qua Hibernate?

Tôi có các lớp sau đây.

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 chứa ánh xạ cho id & studentName tài sản.

Vấn đề tôi phải đối mặt là:

tôi xóa một hàng từ student_master qua Hibernate.

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

Nhưng tài liệu tham khảo của xóa sinh viên (id = 1) không bị xóa từ các bảng teacher_student_mastersubject_student_master.

Làm cách nào để khắc phục sự cố này?

Lưu ý: Sẽ rất tuyệt nếu tôi có thể khắc phục sự cố này bằng cách thực hiện một số loại cấu hình với Hibernate thay vì mã hóa kích hoạt truy vấn &.

Chỉnh sửa: Tôi đã nhìn thấy điều này link. Nhưng trong đó, nó được đề cập rằng tôi cần phải làm một số mã như thế, đầu tiên nhận được tất cả các giáo viên liên kết với sinh viên = 1, sau đó loại bỏ học sinh = 1 từ danh sách sinh viên & rồi cập nhật giáo viên. Tôi muốn tránh mã hóa này. Có thể không?

Trả lời

0

Bạn có thể sử dụng @Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN) cho các cột bạn muốn hành vi này. Xem this question để biết thêm thông tin.

Hoặc, vì bạn đang sử dụng cấu hình Hibernate thông qua XML, hãy sử dụng cascade = "delete-orphan". Hãy xem this blog post nơi các loại thác khác nhau được giải thích.

+2

@RAS đang sử dụng bản đồ XML, không chú thích. Sẽ tốt hơn nếu bạn cung cấp câu trả lời chỉ sử dụng bản đồ HBM. –

+0

Tôi đã nhìn thấy cả hai liên kết do bạn đưa ra. Nhưng trong cả hai liên kết, nó được đề cập rằng tôi cần phải làm một số mã như thế, đầu tiên nhận được tất cả các giáo viên liên kết với sinh viên = 1, sau đó loại bỏ học sinh = 1 từ danh sách sinh viên và sau đó cập nhật giáo viên. Tôi muốn tránh mã hóa này. Có thể không? – RAS

+0

Vâng, giả sử bạn có các bảng sau: Sinh viên, Giáo viên và Khóa học (liên kết Sinh viên và Giáo viên). Bằng cách sử dụng DELETE_ORPHAN về tham chiếu của Học sinh đối với Khóa học, việc xóa học sinh = 1 cũng sẽ xóa tất cả các khóa học có mối quan hệ với sinh viên này. Bạn không cần phải lấy tất cả các khóa học và xóa chúng bằng tay, Hibernate sẽ làm điều đó cho bạn. – Thiago

0

Sử dụng thuộc tính cascade="delete" trong cả hai tệp ánh xạ. Nó có thể giải quyết vấn đề của bạn. Nếu bạn muốn gán "làm mới", sau đó gán nhiều thuộc tính để xếp tầng bằng cách sử dụng ;.

+0

Tôi biết về 'cascade = delete'. Nhưng theo hiểu biết của tôi nó hoạt động như thế nào, nếu tôi xóa bản ghi của ** teacher_master **, nó sẽ xóa bản ghi khỏi ** teacher_student_master **. Trường hợp của tôi là ngược lại. Tôi đang xóa bản ghi khỏi ** student_master ** và không phải từ ** teacher_master **. – RAS

0

Hibernate không xóa các hàng vì lớp Sinh viên không biết về các mối quan hệ. Để thực hiện điều đó, bạn cần phải có các mối quan hệ hai chiều: Danh sách giáo viên/Bộ giáo dục @ManyToMany và Danh sách chủ đề @ManyToMany/Bộ môn học trong lớp học sinh viên

Hoặc ít nhất, xóa cơ sở dữ liệu trên khóa sinh viên nước ngoài của các bảng teacher_student_master và subject_student_master sẽ xóa các hàng trong cơ sở dữ liệu (tôi nghĩ giải pháp đầu tiên là tốt hơn). Tuy nhiên, trong mọi trường hợp, bạn nên lặp lại đối tượng và giáo viên của sinh viên để loại bỏ học sinh này, ngay cả khi hàng bị xóa trong cơ sở dữ liệu, đối tượng sinh viên vẫn ở đó và nó có thể gây ra một số vấn đề trong ứng dụng của bạn. .. nói chung nâng niu mang các mối quan hệ (cả hai bên) trước khi lưu với Hibernate

với một mối quan hệ hai chiều nó dễ dàng hơn

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

for(Subject subject: student.subjects) { 
    subject.remove(student); 
} 
Các vấn đề liên quan