Nhibernate, CRUD e stored procedures.

Che tipo di operazioni su DB deve fare un ORM?
Un ORM è uno strumento per gestire in modo automatico la persistenza di una classe,
intendendo con persistenza le 4 fondamentali operazioni CRUD.
Che poi queste operazioni di CRUD interessino un oggetto e tutte le sue eventuali collezioni magari in contesto transazionale poco cambia...sempre CRUD sono.

Quindi se ho bisogno nei miei processi di business di quelle che definisco operazioni di massa
(es ricalcolo di una colonna su tutta una tabella o calcoli con grouping, statistiche e robaccia varia),
queste NON rientrano tra le operazioni di persistenza.

Quindi uno potrebbe dire...
ok il mio ORM fa solo le CRUD...
io le compilo una volta per tutte su delle stored proc generate ad hoc nel mio DB una volta sola, e sono apposto.

e qui casca l'asino.

Caso 1:
Pensate ad un oggetto del vostro domain model in memoria che contiene 20 field tutti mappati sul DB, alcuni magari anche di tipo BLOB. Di questo oggetto dalla mia applicazione cambio solo un campo e chiedo al layer di persistenza di registrarlo.
Con le stored proc "fisse" che succederebbe? Che in ogni caso farei inutilmente il passaggio di tutti i dati. Non è ottimizzazione questa. NH con il dirty checking invece fa questi controlli e genera l'SQL necessario.

Caso 2:
Nel mio Domain model, una mia classe, aggrega altre classi al suo interno.
Per fare un caricamento anticipato quando inizializzo un oggetto uso delle SELECT che con mirabolanti capriole fanno qualche join e in unico roundtrip ho tutto in memoria. Registro la SELECT in una stored proc. Fichissimo.
Ma se voglio caricare liste di oggetti senza caricare i loro aggregati? in pratica un lazy loading (utilizzatissimo peraltro)?
In questo caso NH (e pochissimi altri) genera al volo l'SQL adatto, utilizza dei dinamic proxy sugli oggetti non caricati e il gioco è fatto. Al momento (e solo allora) in cui l'applicazione richiedera i dati non caricati verranno generate altre SQL statement.

(Ce ne sarebbero anche altri casi ma mi fermo qui!)

Controindicazioni? Ah si sento una vocina....come dici? ...Le Prestazioni?

Beh possiamo fare tutte le teorie del mondo su quanto costa (in termini prestazionali) un boxing, un cast, una introspezione in reflection, e una SELECT su DB...
oppure possiamo fare delle prove su casi d'uso reali e mettere a confronto il mondo ORM con un DAO scritto ad hoc ma ovviamente statico.

Io ho scelto quest'ultima strada, e vi assicuro che i risultati sono sorprendenti
Ma questa è un'altra storia.

Spero di aver soddisfatto la curiosità di Andrea!

Print | posted on mercoledì 31 agosto 2005 18.45

Feedback

# re: Nhibernate, CRUD e stored procedures.

left by Andrea Colaci at 31/08/2005 20.50 Gravatar
Ciao Giancarlo,

trovo interessanti i tuoi post su NHibernate, sicuramente approfondirò l'argomento magari con delle prove pratiche (e perchè no anche grazie al corso...).

permettimi di farti notare che nel caso 1, a volte (a parte nel caso del campo blob, ottimo candidato ad un partizionamento della classe...) è proprio necessario che avvenga il passaggio e il conseguente UPDATE di *tutti* i campi (es. Concorrenza gestita con LAST IN WINS) per evitare problemi di consistenza che, nel caso del dirty checking come vengono attenuati?

Sul caso2 sono concorde ed utilizzo anch'io il lazy load ove necessario (senza NHibernate), lo trovo interessante e sicuramente approfondirò, a proposito esiste qualche libro?

Ti ringrazio.

Andrea Colaci.

# re: Nhibernate, CRUD e stored procedures.

left by Igor Damiani at 31/08/2005 21.29 Gravatar
mi sono interessato a NHibernate, quest'estate...
domanda stupida: che acronimo è CRUD ?

# re: Nhibernate, CRUD e stored procedures.

left by Simone Chiaretta at 31/08/2005 21.40 Gravatar
E le SP?
ipotizziamo (cosa abbstanza reale) che oltre alla persistenza degli oggetti del domain model io debba anche chiamare delle stored proc per fare mass-update, per fare operazioni transazionali su più tabelle, ecc...
Come funziona?
Con un codegenerator io posso generare il metodo per chiamare la stored.. con ORM?
in questo caso dovrei fare due DAL, uno per gestire la persistenza, e uno per gestire le SP... (e nel caso voglia supportare + DB engine dovrei fare n DAL).

Simo

# re: Nhibernate, CRUD e stored procedures.

left by Simone Chiaretta at 31/08/2005 21.41 Gravatar
CRUD sta per:

Create
Read
Update
Delete

# re: Nhibernate, CRUD e stored procedures.

left by Igor Damiani at 31/08/2005 21.46 Gravatar
Simone: ah, ecco....immaginavo qualcosa del genere....solo che non ci arrivavo....stasera sono messo male.....:-/
grazie!

# re: Nhibernate, CRUD e stored procedures.

left by Andrea Boschin at 31/08/2005 22.05 Gravatar
eccolo Andrea. Sono stato fuori tutto il pome e ti leggo solo ora. Dunque, mi dichiaro quasi del tutto soddisfatto. Riconosco che molte delle limitazioni del lavoro con sp vengono superate, però mi preoccupa la questione del crud - non crud. vuoi per caso dirmi che se devo fare una banalissima datagrid che mi mostra gli ordini con a fianco il nome e cognome del cliente che lo ha fatto, nh non mi può aiutare? poni che io abbia l'oggetto ordine e l'oggetto cliente, mica dovrò duplicare le proprietà nome e cognome del cliente nell'ordine per poterlo fare... così l'oop va farsi benedire. probabile che la domanda sia stupida, ma te la faccio lo stesso. mica dovrà are una cosa ibrida ado.net + nh?

ciao e grazie.

# re: Nhibernate, CRUD e stored procedures.

left by Giancarlo Sudano at 01/09/2005 9.57 Gravatar
per Andrea:
Ovviamente le casistiche sono tante e quello che dici è vero....come è vero che IMHO ma molto IMHO :-) la concorrenza Last In Wins....sarebbe da evitare come la peste....tu che dici? :-)

Simone:
Esistono in Nhibernate ovviamente dei metodi per la chiamata delle SP, che disaccoppiano con il database e ti permettono di non dover fare un DAL a parte! stai tranquillo!

Andrea:
Assolutamente no! Il tutto viene gestito dalle "associazioni" brillantemente risolte da NH con le quali il persistence manager genera al volo le viste di cui hai bisogno!
So che è un discorso lungo...quindi aspettavi un bell'articolo per la prossima settimana...c'è tanta roba sul fuoco!

# re: Nhibernate, CRUD e stored procedures.

left by Giancarlo Sudano at 01/09/2005 10.01 Gravatar
ahh scusate...per Igor...Simone ha risposto
ma io aggiungo...CRUD sta per....
Beh prova a chiedere ad un macellaio....
:-))
(Skerzo Igor...sei un mito!)

# re: Nhibernate, CRUD e stored procedures.

left by Andrea Boschin at 01/09/2005 10.04 Gravatar
ok. mi dichiaro ufficialmente convinto! ora per me è obbligatorio procedere alla prova di nh. domandina: ma access non è proprio previsto da nh? per il mio imho mi piacerebbe usare nh, ma il database cui mi appoggio è proprio access. idee?

# re: Nhibernate, CRUD e stored procedures.

left by Simone Chiaretta at 01/09/2005 10.41 Gravatar
Sono stato convinto: scarico NH e lo provo...

# re: Nhibernate, CRUD e stored procedures.

left by Simone Chiaretta at 01/09/2005 10.50 Gravatar
Il mio progetto sarà con ASP.NET 2.0.

Il porting su .NET 2.0? come sta andando?
E' nella roadmap?

# re: Nhibernate, CRUD e stored procedures.

left by Simone Chiaretta at 01/09/2005 10.57 Gravatar
Cmq, Access dovrebbe essere supportato
http://wiki.nhibernate.org/display/NH/Microsoft+Access

# re: Nhibernate, CRUD e stored procedures.

left by Daniele Alessandri at 01/09/2005 12.38 Gravatar
x Simone:
Si' e' previsto un passaggio a .NET 2.0 ma fino a qualche settimana c'erano ancora discussioni sulle modalita' e i tempi, soprattutto perche' quando uscira' la versione 1.0 (manca praticamente giusto la documentazione) sara' quasi automatico l'inizio dei lavori sul porting di Hibernate 3.0 (NHibernate 0.9 si basa su Hibernate 2.1). Insomma a meno che non sia cambiato qualcosa nelle ultimissime settimane, mi sembra che non ci sia ancora certezza sulle tempistiche.

Tra l'altro per chi vuole cimentarsi nella costruzione manuale dei file di mappa di NHibernate senza uscire da Visual Studio, sappiate che e' possibile avere il supporto dell'intellisense! Basta prendere il file nhibernate-mapping-2.0.xsd contenuto nel pacchetto di NHibernate e copiarlo nelle seguenti directory:
- Visual Studio 2003: <VS Install Dir>\Common7\Packages\schemas\xml\
- Visual Studio 2005 B2: <VS Install Dir>\Xml\Schemas\

# re: Nhibernate, CRUD e stored procedures.

left by Andrea Boschin at 01/09/2005 18.17 Gravatar
domanda al guru:

Cito da internet:
Microsoft Access is known to work using SQL Server 7 dialect, but there are problems with join syntax in queries that use more than one join.

da 1 a 10 quanto grave è? Cosa non posso fare?
(lo so è stupida anche questa, ma non vorrei imbarcarmi in qualcosa che poi debbo buttare!).

Ty

# re: Nhibernate, CRUD e stored procedures.

left by Andrea Boschin at 01/09/2005 18.19 Gravatar
dovuta precisazione: non sono scemo, so cos'è una join, quelloche mi manca sono i casi in cui nh ne fa più di una...
Comments have been closed on this topic.