Non ho ancora avuto il tempo di comprendere a fondo la questione, però quando utilizzavo SaveOrUpdate per aggiornare un oggetto già oggetto dello stesso metodo un paio di volte, ottenevo l'eccezione indicata e il record nel db non veniva aggiornata con il Flush successivo. Usando invece SaveOrUpdateCopy, se l'oggetto è già presente nel contesto di persistenza, non viene generata l'eccezione ma viene aggiornato l'oggetto presente (ciò che io pensavo facesse SaveOrUpdate; a questo punto cosa fa SaveOrUpdate? E Update?)
posted on lunedì 23 aprile 2007 0.39
Filed Under [ Scoperte di un principiante NHibernate ]

Comments

Gravatar
# re: NHibernate: eccezione "a different object with the same identifier value was already associated with the session" - SaveOrUp
posted by Antonio
on 13/08/2007 23.52
Ciao.
Anche io mi sono imbattuto nello stesso problema.
Save()/Update() pensavo servissero a persistere, rispettivamente, un oggetto nuovo e le modifiche ad uno esistente, e SaveOrUpdate() discriminasse a seconda della valorizzazione del valore dell'identificatore (funzionava tutto se il generatore era native, mentre occorreva utilizzare esplicitamente save() o update() nel caso assigned).
Uso il passato ed il congiuntivo imperfetto perchè in seguito ho trovato questa faq (http://www.hibernate.org/116.html#A21), e le mie (in)certezze si sono dissolte.
SaveOrUpdateCopy() toglie un po' di castagne dal fuoco nel caso si prenda un oggetto in una session, lo si modifichi e si intenda (o si debba) persisterlo in una session differente (quello che succede comunemente usando nh in asp.net, ma non ricaricando l'oggetto prima di modificarlo, magari perchè è stato "prelevato" dal viestate, o dalla (web) session...).
Questo è quanto ho capito... ora devo capire come fare a persistere un oggetto e tutte le sue collezioni senza che mi salti fuori una ex (...ception) :(
NHibernate.TransientObjectException : object references an unsaved transient instance - save the transient instance before flushing
Your Comment




 
Please add 4 and 6 and type the answer here: