Guida all'applicazione NHibernate Definitive Cascade

Guida all'applicazione NHibernate Definitive Cascade

Quanto segue è adattato dal riferimento Java Hibernate http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive per NHiberate 3.0 (cioè l'attuale trunk svn) .

Per ogni operazione di base della sessione NHibernate, inclusi Persist(), Merge(), SaveOrUpdate(), Delete(), Lock(), Refresh(), Evict(), Replicate(), esiste uno stile a cascata corrispondente. Rispettivamente, gli stili a cascata sono denominati persist, merge, save-update, delete, lock, refresh, evit, replicate. Lo stile a cascata per Save() e Update() è save-update; per SaveAndUpdateCopy() è merge; e per PersistOnFlush() è persistente. E remove è un alias per eliminare.

Se si desidera che un'operazione venga sovrapposta a un'associazione, è necessario indicarla nel documento di mappatura. Ad esempio:

<one-to-one name="person" cascade="persist"/>

Gli stili a cascata possono essere combinati:

<one-to-one name="person" cascade="persist,delete,lock"/>

È possibile utilizzare cascade="all" per specificare che tutte le operazioni devono essere sovrapposte lungo l'associazione. Il valore predefinito cascade="none" specifica che non devono essere eseguite operazioni in cascata.

Uno speciale stile a cascata, delete-orphan, si applica solo alle associazioni uno-a-molti e indica che l'operazione Delete() deve essere applicata a qualsiasi oggetto figlio rimosso dall'associazione. E tutto-cancella-orfano è uguale a tutto, cancella-orfano.

Raccomandazioni:

  • Di solito non ha senso abilitare la cascata su un'associazione o . Cascade è spesso utile per le associazioni e .
  • Se la durata dell'oggetto figlio è limitata dalla durata dell'oggetto padre, rendilo un oggetto del ciclo di vita specificando cascade="all-delete-orphan".
  • Altrimenti, la cascata potrebbe non essere necessaria. Ma se pensi che lavorerai spesso con il genitore e i figli insieme nella stessa transazione e vuoi risparmiarti un po' di digitazione, considera l'utilizzo di cascade="persist,merge,save-update".

La mappatura di un'associazione (una singola associazione con valore o una raccolta) con cascade="all" contrassegna l'associazione come una relazione in stile genitore/figlio in cui il salvataggio/aggiornamento/eliminazione del genitore determina il salvataggio/aggiornamento/eliminazione del figlio o figli. Un figlio che non fa riferimento al suo genitore non viene automaticamente eliminato, tranne nel caso di un'associazione mappata con cascade="delete-orphan". La semantica precisa delle operazioni a cascata per una relazione genitore/figlio è la seguente:

  • Se un genitore viene passato a Persist(), tutti i figli vengono passati a Persist()
  • Se un genitore viene passato a Merge(), tutti i figli vengono passati a Merge()
  • Se un genitore viene passato a Save(), Update() o SaveOrUpdate(), tutti i figli vengono passati a SaveOrUpdate()
  • Se un figlio temporaneo o distaccato viene referenziato da un genitore persistente, viene passato a SaveOrUpdate()
  • Se un genitore viene eliminato, tutti i figli vengono passati a Delete()
  • Se un bambino viene dereferenziato da un genitore persistente, non accade nulla di speciale - l'applicazione dovrebbe eliminare esplicitamente il bambino se necessario - a meno che cascade="delete-orphan", nel qual caso il bambino "orfano" non viene eliminato.

Questo potrebbe essere un consiglio ovvio, ma suggerirei di sfogliare il vecchio post di Ayende. Una rapida ricerca di NHibernate e cascade sul suo sito ha rivelato alcuni post interessanti. Potrebbero, tuttavia, essere un po' troppo scarsi per le tue esigenze.

Anche se non è una risorsa Internet di per sé, consiglierei anche NHibernate in Action. Affronta le cascate in modo approfondito nei capitoli 3, 4 e 6. Il libro prende di mira NHibernate 1.2. Credo, tuttavia, che ci sarà una nuova edizione del libro destinata alla versione 3.0 di NHibernate; potrebbe valere la pena tenerlo d'occhio.

Per quanto mi sarebbe piaciuto vedere una guida definitiva alle cascate non ne ho vista una. Forse potresti riassumere alcuni dei post del blog là fuori che discutono delle cascate con il tuo post sul tuo blog.


Non conosco nessuna guida "definitiva", ma la migliore risorsa che conosco è un post sul blog di Ayende, che è uno dei guru definitivi in ​​NHibernate:

NHibernate Cascades:il diverso tra tutti, elimina tutti gli orfani e salva l'aggiornamento

Per me, in realtà uso solo cascade="none" e cascade="all" . all-delete-orphan a volte è un'opzione. Tutto il resto è sospetto. Ad esempio, perché dovrei creare implicitamente un'istanza perché è referenziata, quando vive più a lungo dell'oggetto contenitore? Per me ci sono solo due situazioni:o l'oggetto è dipendente o indipendente.