2010-09-08 10 views
32

Come utilizzare la cascata e l'inversa in sospensione? Qual è la procedura/tag per definirli? Sono collegati tra loro e come sono utili?Qual è la differenza tra cascata e inversa in ibernazione, a cosa servono?

+2

Googling "hibernate cascade inverse" ha portato [questo] (http://www.mkyong.com/hibernate/different-between-cascade-and-inverse/) come terzo risultato. –

+0

hmmm Non ho notato che ti stavi già riferendo allo stesso link. – YoK

+1

Io e @ArunKumar pensiamo che la risposta di Kaushik Lele debba essere contrassegnata come accettata. – TechSpellBound

risposta

72

In caso di molti-a-molti relazione attraverso tabella intermedia; "Cascade" dice se un record verrà creato/aggiornato nella tabella figlia. Mentre "Inverse" indica se un record verrà creato/aggiornato nella tabella intermedia

ad es. Supponiamo di seguito lo scenario 1 studente può avere più telefoni. Quindi la classe Studente ha una proprietà per Set di telefoni. Anche 1 telefono può essere di proprietà di più studenti. Quindi la classe Phone ha una proprietà per Set of Students. Questa mappatura è menzionata nella tabella stud_phone.

Quindi ci sono tre tavoli vale a dire. Tavolo Studente, Telefono e Stud_phone (intermedio). mappatura potrebbe essere simile:

<set name="phoneset" table="stud_phone" cascade="save-update" inverse="true"> 
    <key column="mapping_stud_id">< /key> 
    <many-to-many class="com.domain.Phone" column="mapping_phon_id"/> 
</set> 

Viene creato un nuovo oggetto di studenti e 2 nuovi oggetti di telefonia vengono aggiunti al suo set. E viene chiamato session.save(student_obj). In base alle impostazioni "a cascata" e "inversa" verranno emesse diverse query.

Di seguito sono riportate diverse combinazioni di cascata e inversa e il loro impatto.

1) cascata è nessuno e inverso è falso

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?) 
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?) 
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?) 

2) CASCADE è nessuno e inverso è vero

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?) 

3) CASCADE è save-update e inverso è falso

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?) 
Hibernate: insert into phone (phone_num, phone_id) values (?, ?) 
Hibernate: insert into phone (phone_num, phone_id) values (?, ?) 
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?) 
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?) 

4) CASCADE è save-update e INVERSE true

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?) 
Hibernate: insert into phone (phone_num, phone_id) values (?, ?) 
Hibernate: insert into phone (phone_num, phone_id) values (?, ?) 

Come si può vedere, solo quando CASCADE è stato salvato-aggiornamento i record sono stati creati anche nella tabella PHONE. Altrimenti no.

Quando INVERSE era falso (cioè lo studente era il proprietario della relazione) veniva aggiornata la tabella intermedia STUD_PHONE. Quando l'inverso è vero, il telefono è proprietario della relazione, quindi, anche se è stato creato un nuovo studente, la tabella intermedia non è stata aggiornata.

Pertanto, in caso di relazione tra due entità, la "cascata" influisce sulla tabella delle altre entità e "inversa" influisce sulla tabella intermedia. Quindi il loro effetto è indipendente.

+3

Questa risposta dovrebbe essere contrassegnata come migliore risposta. +1 per spiegazione dettagliata –

+0

Accetto con @ArunKumar – TechSpellBound

+0

La migliore risposta di sempre. –

24

informazioni di riferimento da Different between cascade and inverse link:

1. inversa: Questo è usato per decidere da che parte è il proprietario rapporto di gestire il rapporto (inserimento o aggiornamento della colonna chiave esterna).

2. cascata: in cascata, dopo una sola operazione (salvo, aggiornamento e cancellazione) è fatto, si deciderà se si ha bisogno di chiamata altre operazioni (salvare, aggiornare ed eliminare ) su un altro soggetti che ha una relazione l'una con l'altra.

Conclusione: In breve, il “inversa” decide da che parte aggiornerà la chiave esterna , mentre “a cascata” decide qual è il seguito da operazione dovrebbe eseguire. Entrambi sembrano molto simili a in relazione, ma sono totalmente due cose diverse. Gli sviluppatori di Hibernate valgono la pena di dedicare tempo alla ricerca su , perché l'incomprensione del concetto o l'uso improprio porteranno gravi problemi di prestazioni o di integrità dei dati a nella loro applicazione.

controllare anche questo argomento del forum: https://forum.hibernate.org/viewtopic.php?f=1&t=949041

Problemi correlati