Posts
163
Comments
179
Trackbacks
5
NHibernate: lazy load e il parametro not-found=”ignore”


Primo post dell’anno, sempre sul caro e “vecchio” NHibernate.
Oggi mi è capitata una situazione particolare, anche se ben codificata. Scenario molto semplice: entità con una reference ad un’altra entità. Nello specifico un preventivo collegato ad un cliente.
Il mapping che stavo utilizzando era questo:

   1: <class name="Preventivo"  table="Preventivi_Testate" lazy="true">
   2:     <id name="ID" type="Int32" unsaved-value="0">
   3:       <generator class="native" />
   4:     </id>
   5:     ...
   6:     ...
   7:     ...
   8:     <many-to-one name="Cliente" class="Cliente" column="IDAnagrafica" not-found="ignore"></many-to-one>
   9: </class>

Apparentemente tutto corretto e infatti tutto funziona senza problemi.
Andando però a controllare le query che vengono generate da NHibernate si noterà che il lazy load sull’associazione Cliente non funziona e ogni volta che si recupera un Preventivo si va a fare una query anche per recuperare il Cliente. Questo anche senza accedere alla proprietà Cliente sul Preventivo.

Il problema è dovuto al parametro not-found=”ignore”. Rimuovendolo tutto torna a funzionare correttamente.
Il comportamento è in effetti legittimo e codificato. In presenza dell’attributo not-found=”ignore”, NHibernate deve restituire l’entità nel caso sia presente e Null (o Nothing) in caso l’entità non sia presente. Per fare questo l’unico modo è ovviamente quello di andare ad eseguire la query sul database. Nel caso in cui l’attributo not-found non sia specificato, NHibernate può tranquillamente istanziare un proxy ed eventualmente lanciare un’eccezione nel caso l’entità non sia trovata.

Attenzione quindi ad utilizzare l’attributo not-found=”ignore” perché vi potreste trovare con una moltitudine di query eseguite a vostra insaputa.

posted on martedì 12 gennaio 2010 17:24 Print
Comments have been closed on this topic.
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.

La mia foto

Logo MCAD
Logo MCTS