2013-08-22 8 views
6

Sto usando Hibernate 3.0 con Java.Come cancellare una riga e tutti i suoi riferimenti dal database tramite Hibernate?

Ho le seguenti classi.

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 contiene mappature per id & studentName proprietà.

problema che sto affrontando è:

ho eliminare una riga da student_master tramite Hibernate.

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

Ma i riferimenti del eliminata studente (id = 1) non vengono cancellati dalle tabelle teacher_student_master e subject_student_master.

Come posso risolvere questo problema?

Nota: Sarebbe bello se riuscissi a risolvere questo problema eseguendo una sorta di configurazione con Hibernate invece di codificare l'attivazione della query &.

Modifica: ho visto questo link. Ma in questo, si dice che ho bisogno di fare un po 'di codifica, in primo luogo ottenere tutti gli insegnanti associati a student = 1, quindi rimuovere lo studente = 1 dall'elenco dello studente & quindi aggiornare l'insegnante. Voglio evitare questa codifica. È possibile?

risposta

0

È possibile utilizzare @Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN) per le colonne che si desidera questo comportamento. Vedere this question per ulteriori informazioni.

Oppure, dal momento che si utilizza la configurazione di Hibernate tramite XML, utilizzare cascade = "delete-orphan". Dai uno sguardo allo this blog post dove vengono spiegati diversi tipi di cascate.

+2

@RAS sta usando mapping XML, non annotazioni. Sarebbe meglio se fornissi la risposta usando solo la mappatura HBM. –

+0

Ho visto entrambi i link dati da te. Ma in entrambi i link, è stato detto che ho bisogno di fare un po 'di codice, in primo luogo ottenere tutti gli insegnanti associati a studenti = 1, quindi rimuovere lo studente = 1 dall'elenco degli studenti e quindi aggiornare l'insegnante. Voglio evitare questa codifica. È possibile? – RAS

+0

Bene, supponiamo di avere le seguenti tabelle: Studente, Insegnante e Corso (che collega Studente e Insegnante). Utilizzando DELETE_ORPHAN sul riferimento dello studente al corso, eliminando lo studente = 1 verranno eliminati anche tutti i corsi che hanno una relazione con questo studente. Non devi recuperare tutti i corsi ed eliminarli manualmente, Hibernate lo farà per te. – Thiago

0

Utilizzare la proprietà cascade="delete" in entrambi i file di mapping. Potrebbe risolvere il tuo problema. Se si desidera assegnare "Aggiorna", assegnare più proprietà a cascata utilizzando ;.

+0

Conosco 'cascade = delete'. Ma per quanto ne so io funziona, se cancello il record di ** teacher_master **, cancellerà il record da ** teacher_student_master **. Il mio caso è invertito. Sto eliminando il record da ** studente_master ** e non da ** insegnante_master **. – RAS

0

Hibernate non elimina le righe perché la classe Student non è a conoscenza delle relazioni. Per fare ciò dovresti avere delle relazioni bidirezionali: un @ManyToMany List/Set di Teacher e un @ManyToMany List/Set of Subject nella classe Student

O, almeno, un database cancella in cascata sulla chiave esterna student_id delle tabelle teacher_student_master e subject_student_master cancelleranno le righe nel database (penso che la prima soluzione sia migliore).

Ma, in ogni caso, dovresti scorrere le materie e gli insegnanti dello studente per rimuovere questo studente, anche se la riga è stata cancellata nel database, l'oggetto studente è ancora lì e potrebbe sollevare alcuni problemi nella tua applicazione. .. in generale prendersi cura di relazioni (entrambi i lati) prima di salvare con Hibernate

con un rapporto bidirezionale è più facile

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

for(Subject subject: student.subjects) { 
    subject.remove(student); 
} 
Problemi correlati