Se ti becco ti persisto! ovvero La Persistence by Reachability secondo NHibernate

Immaginate un bella classettina così composta:
(I puristi mi perdoneranno per il non uso delle property ma le ho omesse solo per salvare spazio...e perchè non ho il mio portatile e scrivo da web!!)

Public Class Fattura
   Public Numero as Integer
   Public Anno as integer
   Public Data as Datetime
   Public Cliente as Cliente
   Public Ordine as Ordine
   Public Dettagli as DettaglioFatturaCollection

   Public Sub New()
      'Inizializza un po tutto :-)
   End Sub 
End Class

La classe Fattura aggrega una istanza di tipo Cliente e una di tipo Ordine e ha anche una bella custom collection tipizzata per contenere i suoi dettagli.Qualche altro campo per il numero e data di fattura e dal punto di vista del Domain Model sono apposto così.

Non voglio approfondire quale sia la modalità di mapping di un oggetto del genere ma solo parlare di una particolarità di comportamento di NHibernate che è veramente un piccolo gioiellino...
Tramite questa feature chiamata Persistence by Reachability il persistence manager assicura che al momento in cui un oggetto viene persistito, tutti gli oggetti che referenzia (e che hanno una mappatura) saranno persistiti.
E se glielo chiediamo pure...sarà tutto fatto in contesto transazionale.

Che vuol dire?
In soldoni che io faccio qualcosa del genere:

Dim fattura as Fattura = session.Get(GetType(Fattura), numeroFattura) ' con questo da Nhibernate ottengo il caricamento dell'oggetto fattura
fattura.Data = Now
fattura.Ordine.Confermato = true;
fattura.Cliente.RagioneSociale = "La cambio qui perchè sono pazzo"
fattura.Cliente.Responsabile.Nome = "Cambio qui perchè sono ancora più pazzo" 'Responsabile potrebbe essere un ulteriore oggetto Persona aggregato in Cliente
fattura.Dettagli.Add(new nuovoDettaglio)
fattura.Dettagli(3).Descrizione = "Qualcosa"
fattura.Dettagli.RemoveAt(4)
'e via dicendo

e solo con la magica

Dim tx as ITransaction = session.BeginTransaction 'notare che il tipo ITransaction è generico per tutti i DB!!
session.SaveOrUpdate(fattura)
tx.Commit

Tre (ripeto Tre!) sole righe di codice e verranno scatenate le dovute SQL per aggiornare
l'oggetto Cliente (aggregato), l'oggetto Ordine (aggregato), l'oggetto Fattura (aggregatore), e tutta la collezione di dettagli fattura (insert update e delete del caso). Che sia gestito in maniera transazionale o no, siccome Nhibernate è furbo tutte le SQL passeranno in un unico RoundTrip con il DB.(Ho dei sospetti che la session viva di vita propria...inquietante!)

Provate ad attivare SQL Profiler e sniffare cosa passa sul DB.
Questa è la magia della persistenza.
Meditate gente, meditate.

Alla prossima un confronto tra dataset e Domain model....(aaaahhh li ho messi assieme nella stessa frase!!)

Maggiori dettagli?
sempre qui 
Scrivere meno codice usando blocchi già pronti? Si può: NHibernate e Enterprise Library! 

 
Ai soci Ugi c'è pure lo sconto!

Print | posted on giovedì 1 settembre 2005 17.41

Feedback

# Re: Se ti becco ti persisto! ovvero La Persistence by Reachability secondo NHibernate

left by Stefano Paparesta at 01/09/2005 19.14 Gravatar
Sono senza parole.....

A dimenticavo, dopo tutti questi post che hai fatto su NH mi sono iscritto all'evento dell' 8 a Milano, non vedo l'ora. Spero che tanti altri si aggreghino.
Ciao Stefano

# Re: Se ti becco ti persisto! ovvero La Persistence by Reachability secondo NHibernate

left by Stefano Paparesta at 02/09/2005 9.03 Gravatar
Volevo chiederti, chiaramente gestendo i dati con collection tipizzate, ove necessario, per esse avrò anche la possibilità di databinding nell'nterfaccia, giusto ?? Visto che nel prossimo post parli di Dataset e Domain Model, potresti chiarirmi questo aspetto ?
Mi rendo contro che non sia un aspetto fondamentale, ma il data binding aiuta a scrivere meno codice, tu come lo gestisci ?

Stefano

# re: Se ti becco ti persisto! ovvero La Persistence by Reachability secondo NHibernate

left by Andrea Boschin at 02/09/2005 9.46 Gravatar
su questo ti rispondo io. certo che sì. se poi ti leggi il materiale di raffaele rialdi sul databinding, che trovi tra gli eventi passati, capirai nche che si può fare meglio dei dataset...

# re: Se ti becco ti persisto! ovvero La Persistence by Reachability secondo NHibernate

left by Simone Chiaretta at 02/09/2005 9.55 Gravatar
Quasi quasi mi iscrivo all'evento dell'8 novembre a Milano... anche se, come dicevo in un'altro post, per allora la mia applicazione dovrà già essere quasi in versione demo (almeno per una parte)... e quindi, per allora dovrò conoscere già molte cose su NH (spero)

# Re: Se ti becco ti persisto! ovvero La Persistence by Reachability secondo NHibernate

left by Stefano Paparesta at 02/09/2005 10.17 Gravatar
Si me lo ricordo bene il workshop e anche il thread sul forum di Vb.net antecedente quel workshop in cui Raffaele ha ampiamente spiegato i perchè delle sue scelte, è chiaro che c'è parecchio codice da scrivere, oltre alle classi, alle collection anche il codice necessario a far funzionare il databing degli oggetti. Raffaele se non ricordo male ha detto che si è costrutio un add-in per VS per generare il codice ripetitivo, voi che cosa usate ?? Leggo spesso di CodeSmith, lo usate, ci sono altri prodotti che possono andare bene o vi siete costruiti i vostri add-in come Raffaele ?

# re: Se ti becco ti persisto! ovvero La Persistence by Reachability secondo NHibernate

left by Lorenzo Barbieri at 02/09/2005 11.25 Gravatar
Per Simone... beh... diciamo che c'è sempre spazio per migliorare!!!

# Re: Se ti becco ti persisto! ovvero La Persistence by Reachability secondo NHibernate

left by Lorenzo Melato at 22/09/2005 10.55 Gravatar
Ciao Giancarlo, sto seguendo con molto interesse i tui post su NHibernate, sapresti indicarmi qualche link a esempi "real world" di utilizzo ? a quando un bell'articolo ? Probabilmente sarò anch'io al workshop di Verona al quale spero di arrivare già un po' preparato.
Comments have been closed on this topic.