2010-03-03 5 views
9

Comment puis-je forcer Hibernate à mettre à jour une instance d'entité même si l'entité est et non sale? J'utilise Hibernate 3.3.2 GA, Hibernate Annotations et Hibernate EntityManager btw. Je veux vraiment que Hibernate exécute l'instruction UPDATE générique même si aucune propriété de l'entité n'a changé.Forcer la mise à jour dans Hibernate

J'ai besoin de cela car certains écouteurs d'événements doivent être appelés pour effectuer un travail supplémentaire lorsque l'application s'exécute pour la première fois.

Merci!

Répondre

10

ok - Je l'ai trouvé moi-même. Cela fait l'affaire:

Session session = (Session)entityManager.getDelegate(); 
session.evict(entity); 
session.update(entity); 
+0

+1 J'avais entendu parler avant l'affaire, mais n'a pas pu le rappeler. – ewernli

+0

Astuce soignée mais je viens de l'essayer et il vaut la peine de souligner que si vous êtes également intéressé par cette validation "entity.childEntity", il ne sera pas - il casse l'arbre de dépendance. –

0

Essayez em.flush() qui est utilisé pour EJB 3.0 entités, qui utilise également JPA similaire à Hibernate 3.2.2 GA. Si cela ne fonctionne pas normalement, utilisez la couleur dans les transactions.

+1

Flush force Hibernate à synchroniser les modifications de la mémoire avec la base de données. Mais si Hibernate ne considère pas l'entité comme sale, elle ne va rien faire pour autant que je me souvienne. – ewernli

+0

yep - flush() ne aide pas ici car aucun changement n'est fait – gubrutz

1
session.evict(entity); 
session.update(entity); 

Bon tour, mais faites attention aux objets transitoires avant de mettre cela dans un code d'automatisation. Pour les transitoires je puis StaleStateObjectException

3

Pour transitoires, vous pouvez vérifier

if(session.contains(entity)) { 
    session.evict(entity); 
} 
session.update(entity); 
Questions connexes