NHibernate
Un eccezionale ORM open source
Non mi stancherò mai di decantare la versatilità di NHibernate nel supportare domain model eterogenei. Esempio pratico: il nostro sito internet ha un sacco di pagine pressoché statiche, tipo il classico "Chi siamo", "Mission dell'Azienda", ecc.ecc. Vogliamo permettere all'amministratore di inserire questi dati nel DB, ma vogliamo anche lasciarci la strada aperta ad aggiunte future, così se domani il cliente si sveglia e vuole anche una bella pagina con i contatti, possiamo aggiungerla senza modificare lo schema. Un'idea può essere quella di contenere tutti questi dati all'interno di un bel Dictionary, ma come lo mappiamo con NHibernate? Presto detto, basta...
Parlo di Cuyahoga, il noto CMS basato su Castle Windsor e NHibernate. Incuriosito da questo post di Ayende ieri ne ho spulciato un po' i sorgenti. E visto che li considero didatticamente interessanti, ve li consiglio. Certo, non è da prendere tutto come oro colato (il modulo del Forum, ad esempio, espone tutti i servizi in una grande, enorme, monolitica classe, che accede direttamente a NHibernate, brrrrr...) però può essere una buona sorgente per qualche idea. Tanto per dirne una, mi è piaciuta la strutturazione del Data Access Layer che sfrutta la "trasversalità" di NHibernate: IUserDao espone solo i servizi specifici dell'utente...
C# 3.0 permette una notazione compatta per le proprietà che si limitano semplicemente a wrappare un corrispondente field: 1: public string Descrizione { get; set; }
Sulle prime mi è sembrata un'innovazione piuttosto utile, se non altro per le entity di dominio, che notoriamente non hanno logica e che risultano essere parecchio più veloci da scrivere e leggibili. Così utili che ho anche realizzato un accessor per farle supportare da NHibernate (lo trovate qui).
Poi ho iniziato a sperimentare un po' e... beh... mi convincono fino ad un certo punto. Perchè? Beh, ovviamente devono avere...
Oramai non ne faccio più mistero: chiacchierare di NHibernate mi piace dannatamente, cercare di contribuire alla sua diffusione ancora di più, sfruttarlo per scopi professionali è poi una vera goduria. Fatto sta che ho rotto talmente le scatole a qualcuno, che alla fine abbiamo convenuto che era meglio mettere nero su bianco e vedere cosa si riusciva a tirar fuori. Risultato? Oltre le più rosee aspettative: un articolo introduttivo e *MOLTO* pratico, pubblicato oggi su Aspitalia.com, e addirittura uno speciale su quello che è un po' l'ORM del momento. Ringrazio tantissimo Daniele, Ricky, Ugo e Marco di Aspitalia.com che mi hanno supportato...
E' innegabile che, nell'ultimo anno, si faccia un gran parlare in rete di O/RM ed in particolare di NHibernate. Capita sempre più spesso di leggere un post qui, un articolo lì e soprattuto tante, tantissime domande su forum e newsgroup di persone in qualche modo affascinate o incuriosite da questo modo relativamente nuovo di gestire le problematiche di persistenza. Ciò che mi ha sempre colpito è come, a ragion veduta, in molti vedano in NHibernate un qualcosa che finalmente si occupa di scrivere SQL al posto nostro. Ma in realtà c'è molto, molto di più in quel dannato assembly, features che tante volte...
Come segnalato da Ayende, è oramai praticamente completo NHibernate.Search. Cos'è? E' l'integrazione con NHibernate del famoso full-text search engine Lucene. La documentazione non è ancora disponibile, ma il funzionamento è assolutamente analogo a quello della controparte Java, che si trova qui. Non vedo l'ora di dargli un'occhiata. Technorati tags: NHibernate
Ancora grazie ad Emanuele per aver pensato a questa iniziativa. Farò di tutto per non mancare, perché l'argomento mi appassiona tantissimo (oltre che essere di estrema attualità). Appuntamento alle ore 21, le modalità di partecipazione sono descritte in qui.
L'interfaccia ISession di NHibernate mette a disposizione due metodi per recuperare una entity da DB a partire dal suo identificativo, ossia ISession.Get e ISession.Load. La prima differenza che salta all'occhio è che, nel caso l'oggetto voluto non esista, Get ritorna una null-reference, mentre Load solleva una ObjectNotFoundException. Molto più importante, secondo me, è però il fatto che, nel caso in cui il tipo sia configurato come Lazy Initializable (quindi attributo Lazy="true" nel mapping della classe), Session.Load restituisce il proxy e non l'oggetto stesso. E' un aspetto molto comodo tutte le volte in cui abbiamo bisogno di una reference ad...
Janky ha scritto in questo post che una delle novità della nuova beta di NHiberante 1.2.0 è il nuovo connection model. Qual è la differenza? Piccola premessa: è (ed era) possibile fornire alla session una propria connessione, creata esternamente a NHibernate, quindi; in questo caso sarà sempre responsabilità dell'utente gestirne il ciclo di vita. E nel caso (più comune) in cui lasciamo fare a NHibernate? Prima di beta 3 La connessione veniva aperta alla prima occasione in cui si rendeva necessaria un'interazione con il DB e da quel momento restava aperta fino alla dispose della Session o ad una chiamata...
Scrivo solo oggi perché ho avuto un weekend piuttosto
intenso! Che dire... contentissimo! Intanto mi sento di ringraziare Gian Maria, Diego, Stefano e tutti gli altri ragazzi per la splendida organizzazione,
per il caffé nel termos che mi ha salvato dal crollo, per i pasticcini che
invece hanno salvato Igor e soprattutto l'albero di natale aziendale, senza il
quale io e Janky non avremmo potuto sistemare le ultime robine sulle slide
durante la sessione di Simone (già... perché da che mondo è mondo, le slide
e le demo devono essere completate 30 secondi prima di parlare, altrimenti porta
sfiga).
Mi spiace di...
Come fare per utilizzare il pattern SpecialCase con NHibernate?
C.p.l.
...per farci le preghierine la sera. Già, quello di Ayende su MSDN che trovate qui. Correte, leggetelo, rileggetelo, bevete un bicchier d'acqua e leggetelo un'altra volta. Strepitoso. Punto.
Stento ancora a crederci... trattengo con fatica la gioia... il domani ha tinte più rosee... piove governo ladro! E' uscita la primissima release di NHDomainMapper!! Non scrivo altro, anche perché non avrebbe senso: oramai avrete tutti abbandonato questa pagina per volare a quella del download! Una sola nota: ogni bug che troverete, sappiate che è colpa di Janky, ghghhg!!
Avvertenza: questo è un post autocelebrativo, Janky mi ha pagato profumatamente per scriverlo, quindi se vi farà venire il diabete prendetevela con lui. Windows Vista è quasi in RTM? Avete provato Orcas per la prima volta? Office 2007 lo usate già da un po'? Vi piace HappySign di Igor? STICA!!! Siete il nulla: sta per arrivare NHibernate Domain Mapper rel.0.1 alpha codename SUPERTANGA!! Ora, visto che un rilascio ufficiale non c'è ancora stato, purtroppo credo che difficilmente che ci sia qualcuno, oltre me e il bravo Sudano, in possesso di queste fantasmagoriche righe di codice C#. Tanto per dare un'ulteriore...
Quarto articolo della serie su NHibernate, questa volta
a proposito del supporto a DB Schema legacy che contengano chiavi primarie
comprendenti più colonne.
Lo spunto mi è venuto da un dubbio esposto da Luca Beretta
qualche giorno fa, vediamo un po' se ho preso due piccioni con una fava, magari
riuscendo anche a risolvergli il problema!
In questi mesi sto studiando (e soprattutto utilizzando) così tanto NHibernate che magari
un giorno impazzisco, mi monto la testa e organizzo anche un
corso, ehehehe!!
powered by IMHO 1.3
O meglio, le avrà, dato che questa nuova features è per
il momento stata introdotta esclusivamente a livello di sorgenti, che comunque
si
possono scaricare dal server SVN.
Ayende ne
parla un po' sul suo blog, con tanto di esempio pratico su
come specificarle nel file di mapping. La gestione è probabilmente un
po' macchinosa e, soprattutto, IMHO è perfettamente inutile nel 99% dei casi,
perché si manda allegramente in malora tutta la flessibilità che un ORM può dare
nel tuning delle query.
Però, dato che la gente le chiedeva a gran voce, sappiate che son
lì.
powered by IMHO 1.3
Sto utilizzando NH in un progetto che si appoggia su DB Oracle e mi sono imbattuto in una piccola grana che ha a che fare con lo "strano" modo di questo RDBMS di gestire i campi VARCHAR.
C.p.l.
Nel terzo articolo su NHibernate parliamo dell'oggetto
Interceptor e di come può essere utilizzato per personalizzare il comportamento
standard di una Session. L'esempio proposto, questa volta, riguarda la realizzazione di un sistema di Audit che tenga traccia degli autori delle modifiche effettuate sulle entity. Devo ringraziare Giancarlo per avermi indicato questa come la soluzione più comoda per risolvere questa problematica così comune.
Chi fosse interessato, lo trova a questo link.
Ciao
powered by IMHO 1.3
Dopo il precedente, ho pensato di scrivere un altro piccolo articolo su NHibernate,
questa volta a proposito del mapping di classi in relazione di ereditarietà tra
di loro, con tanto di nuova applicazioncina di esempio
Chi fosse interessato alla lettura, può trovarlo seguendo questo link.
powered by IMHO 1.3
Il
LazyLoad in NHibernate non si limita solo ai casi di relazioni Master/Detail:
questo framework, infatti, mette a disposizione uno strumento estremamente
completo, che permette di caricare al momento opportuno qualsiasi
entity.
Visto che il 99% degli esempi che si trovano in
rete riguardano però solo il primo caso, ho scritto un piccolo articolo che
approfondisce un po' il funzionamento del Lazy Load sviscerandolo un pochino di
più (non molto, eh! ), con tanto di applicazioncina di esempio.
Spero di aver fatto una cosa gradita, trovate tutto
a questo link. Se l'idea vi piace, mandatemi qualche
feedback, così magari posso proseguire la serie...
Già già, finalmente stasera (a tempo di record) hanno
attivato il progetto di NHibernate Domain Mapper su CodePlex. Per ora non abbiam messo su ancora
nulla, lo farò nei prossimi giorni, ma speriamo di riuscire ad approfittare
delle ferie per tirar fuori una prima early build, così potrete anche voi dare
un'occhiata a quello che, per me e Janky, è diventato
il passatempo di quasi ogni sera e ogni weekend.
Se poi ci volete dare anche una mano...
powered by IMHO 1.3
Mi ricollego a quanto già scritto sul mio blog e alla discussione nata su quello di Imperugo, a proposito dell'argomento "ORM fatti in
casa", perché stamattina mi sono imbattuto in un interessante post di Ayende a proposito
delle performance di NHibernate.
Tutto è nato da un post in cui si confrontavano la velocità di questo OR/M e ADO.NET;
beh... sono d'accordo con chi dice che ovviamente NH non può essere più veloce
di ADO.NET per il semplice fatto che è un layer costruito sopra ad
ADO.NET. Ma come si è ripetuto più spesso anche da queste parti, lo
scopo di NH è quello...
... e purtroppo neanche Hibernate ne è immune. Da
questo post di Roy Osherove che
cita una notizia di ORMappers.com:
"Red Hat will face a patent infringement lawsuit this week over whether
Hibernate, which it inherited from JBoss violates ORM patents held by FireStar
Software. FireStar alleges that Hibernate violates U.S. patent 6,101,502 -- "
Object model mapping and runtime engine for employing relational database with
object oriented software."
[NetworkWorld.Com]
Si tratta di un brevetto che riguarda la generazione di strutture di DataBase
a partire da modelli a oggetti e viceversa.
Mah......
Ieri Imperugo di ASPItalia ha pubblicato un post a proposito di NHibernate sul suo blog e
ne è seguita una discussione parecchio interessante con nostromo, Daniele e ricky, proseguita con quest'ultimo anche su MSN.
Un passo di tutto questo disquisire era qualcosa del tipo: "ha senso una Unit of Work in una Web Application, in cui il codice lato server è
solitamente stateless?"
Secondo Riccardo "una UoW ha il compito di creare un contesto transazionale a livello di logica applicativa, cosa che nel web per motivi prestazionali è preferibile fare in altri modi" e quindi scegliere se utilizzarla o meno dipende dai casi;...
Una delle maggiori problematiche per chi ha avuto
qualche esperienza con NHibernate è il fatto che questo
O/RM non gestisce direttamente collection strongly-typed. Ammetto di
non aver cercato moltissimo in giro per la
rete, ma in quei 3 o 4 esempi che ho guardato, le business entities
avevano sempre la forma
public class Master{ // ... more code ... private IList details; public IList Details { get { return details; } }}
Questo tipo di implementazione pone alcune
problematiche: oltre al fatto di essere weakly-typed, può funzionar bene se
viene utilizzata in una pagina ASP.NET, grazie al databinding poco
"interattivo", ma se proviamo a collegarla ad una windows forms perdiamo un
sacco di funzionalità a cui eravamo abituati usando i DataSet (il refresh dei
dati sullo schermo...