2009-06-03 6 views
6

Le JavaDoc Hibernate indique que Session.update(Object o) déclencherait une exception s'il existe déjà une instance persistante de o, non?Hibernate est * PAS * lancer une exception (je pense qu'il devrait)

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

Cependant, le code suivant ne lance rien lorsque je l'exécute. Et je pense que ça devrait!

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! :(

Comme vous pouvez le dire, deux fois j'essaie de faire plusieurs update() s, mais toujours Hibernate prend facilement sur moi.

Quelqu'un a une intuition pourquoi?

EDIT: il semble que cela ne ferait que jeter si un autre objet équivalent, par exemple, email2 avec le même ID que email. Je suppose que la documentation était un peu bâclée là-bas.

+0

Oui! les docs ne veulent jamais l'écrire clairement et cela m'amène à cette question! – GMsoF

Répondre

8

La mise à jour dans Hibernate n'est pas mise à jour en langage SQL. Hibernate gère SQL UPDATEs automatiquement via le cache d'état dans l'objet Session.

Mais ce n'est que pour les entités chargées dans la session en cours. Cette méthode, session.update (objet) est destinée à attacher un objet d'un autre niveau à la session en cours pour suivre et, éventuellement, mettre à jour à la fin.

Dans votre cas, c'est juste un NOOP. Il va aigrement jeter si:

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 

Vous pouvez en savoir plus sur la mise à jour sémantique de la méthode sur Hibernate reference.

+0

c'est une meilleure solution avec un exemple clair! – GMsoF

0

Pouvez-vous essayer avec un session.flush()? Pour voir si cela soulève l'exception (parfois commit peut ne pas vider les données en fonction du mode flush). Bien que je dirais que l'exception n'est levée que si l'objet a été mis à jour en dehors de la portée de la session en cours, disons par un client simultané.

6

Aucune erreur car c'est la même instance que celle que vous mettez à jour.

L'erreur est levée si une instance persistante DIFFERENTE est présente dans la session et que vous essayez de mettre à jour().

+0

les obtient à chaque fois –

+1

Je pense que ce n'est pas 'DIFFERENT instance persistante', c'est' DIFFERENT instance détachée'. – GMsoF

Questions connexes