2013-08-22 10 views
6

私はJavaでHibernate 3.0を使用しています。Hibernateを介してデータベースから行とそのすべての参照を削除するには?

私は以下のクラスを持っています。

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.xmlID & studentName特性のマッピングを含んでいます。私が直面してる

問題は次のとおりです。

私は休止状態によるstudent_masterから行を削除します。

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

しかし、削除された学生の参照(ID = 1)はテーブルteacher_student_mastersubject_student_masterから削除されません。

どうすればこの問題を解決できますか?

注:&クエリの発行をコーディングするのではなく、Hibernateで何らかの設定を行うことでこの問題を克服できれば幸いです。

編集:私はこれを見ましたlink。しかし、それで私はいくつかのコーディングを行う必要があると言われています。まず、student = 1に関連付けられたすべての教師を取得し、学生のリストからstudent = 1を削除して&のリストから教師を更新します。私はこのコーディングを避けたい。出来ますか?

答えて

0

この動作を実行する列に対して@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)を使用できます。詳細については、this questionを参照してください。

XMLでHibernate設定を使用しているため、cascade = "delete-orphan"を使用してください。さまざまな種類のカスケードが説明されているthis blog postを見てください。

+2

@RASだ双方向の関係で休止状態

を保存する前に、関係の世話(両側)を話します。 HBMマッピングのみを使用して回答を提供する方が良いでしょう。 –

+0

私はあなたから与えられた両方のリンクを見ました。しかし両方のリンクでは、私はいくつかのコーディングを行う必要があると言われています。まず、student = 1に関連付けられたすべての教師を取得し、student = 1をstudent&私はこのコーディングを避けたい。出来ますか? – RAS

+0

さて、あなたは次のテーブルを持っているとしましょう:学生、教師、コース(学生と教師をつなぐ)。生徒のCourseへの参照でDELETE_ORPHANを使用すると、student = 1を削除すると、この生徒と関係のあるすべてのコースも削除されます。すべてのコースをフェッチして手動で削除する必要はなく、Hibernateがそれを行います。 – Thiago

0

両方のマッピングファイルでcascade="delete"プロパティを使用します。あなたの問題を解決するかもしれません。 「リフレッシュ」を割り当てたい場合は、複数のプロパティを;を使用してカスケードに割り当てます。

+0

私は 'cascade = delete'について知っています。しかし私の知る限り、** teacher_master **のレコードを削除すると、** teacher_student_master **のレコードが削除されます。私の場合は逆です。私は** teacher_master **からstudent_master **&fromのレコードを削除しています。 – RAS

0

Hibernateは、Studentクラスが関係を認識していないため、行を削除しません。これを行うには、双方向の関係が必要です:@ManyToMany List/TeacherのセットとStudentクラスの@ManyToMany List/Subjectのセット

または少なくとも、外部キーstudent_idのデータベース削除カスケードテーブルのteacher_student_masterとsubject_student_masterはデータベースの行を削除します(私は最初の解決策が良いと思います)。

ただし、学生の科目と教師を繰り返してこの学生を削除する必要があります。データベース内の行が削除されても、生徒オブジェクトはまだ存在し、アプリケーションで問題が発生する可能性があります。 ...一般的注釈、XMLマッピングを使用していないされ、それが簡単に

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

for(Subject subject: student.subjects) { 
    subject.remove(student); 
} 
関連する問題