2009-06-03 10 views
6

Hibernate JavaDoc afferma che Session.update(Object o) genererebbe un'eccezione se è già presente un'istanza persistente di o, giusto?Hibernate * NON * genera un'eccezione (penso che dovrebbe)

If there is a persistent instance with the same identifier, an exception is thrown.

Tuttavia, il seguente codice non genera nulla durante l'esecuzione. E penso che dovrebbe!

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

session.save(email); 
session.update(email); 
session.update(email); 

tx.commit(); 

// didn't throw... Let's try again 

tx = session.beginTransaction(); 

session.update(email); 
session.update(email); 

tx.commit(); 
session.close(); 

// still nothing! :(

Come si può dire, due volte che cerco di fare più update() s, ma ancora Hibernate sta prendendo facile su di me.

Qualcuno ha un sospetto perché?

EDIT: sembra che getterebbe solo se un altro oggetto equivalente, per esempio, email2 con lo stesso ID di email. Immagino che la documentazione fosse piuttosto sciatta lì.

+0

Sì! i doc non vogliono mai scriverlo e mi portano a questa domanda! – GMsoF

risposta

8

Aggiornamento in Hibernate non è di aggiornamento in linguaggio SQL. Hibernate gestisce gli AGGIORNAMENTI SQL automaticamente attraverso la cache di stato nell'oggetto Session.

Ma è solo per le entità caricati nella sessione corrente. Questo metodo, session.update (oggetto) è pensato per collegare l'oggetto da un altro livello alla sessione corrente per tracciare e, possibilmente, aggiornare alla fine.

Nel tuo caso è solo un NOOP. Sarà acidamente buttare se:

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

int id = session.save(email); 
Email anotherEmail = new Email("", "", ""); 
anotherEmail.id = id; 

session.update(anotherEmail); // will throw 

Si potrebbe leggere di più su metodo di aggiornamento semantica su Hibernate reference.

+0

questa è una soluzione migliore con chiaro esempio! – GMsoF

0

Puoi provare con session.flush()? Per vedere se ciò solleva l'eccezione (a volte il commit potrebbe non scaricare dati a seconda della modalità flush).

Anche se direi che l'eccezione viene generata solo se l'oggetto è stato aggiornato al di fuori dell'ambito della sessione corrente, diciamo da un client concorrente.

6

Nessun errore perché è la stessa istanza che si sta aggiornando.

L'errore viene generato se nella sessione è presente un'istanza DIFFERENTE persistente e si tenta di aggiornare().

+0

li ottiene ogni volta –

+1

penso che non sia 'DIFFERENT istanza persistente', è' DIFFERENT detached instance'. – GMsoF

Problemi correlati