2009-06-02 15 views
1

J'ai une méthode qui récupère les entités en utilisant un NamedQuery. Je mets à jour une valeur de chaque entité puis exécute une autre requête nommée (dans la même méthode et Transaction) en filtrant par l'ancienne valeur et elle renvoie les mêmes Entités que si je ne les avais pas modifiées.JPA NamedQuery ne prend pas les modifications apportées à l'entité modifiée

Je comprends que le EntityManager doit être rincé et aussi que cela devrait se faire automatiquement mais cela ne fait aucune différence.

J'ai activé la journalisation SQL hibernate et je peux voir que les entités sont et non mises à jour lorsque j'appelle flush mais quand la transaction de conteneur est validée.

EntityManager entityManager = getPrimaryEntityManager(); 
MyEntity myEntity = entityManager.find(MyEntityImpl.class, allocationId); 
myEntity.setStateId(State.ACTIVE); 
// Flush the entity manager to pick up any changes to entity states before we run this query. 
entityManager.flush(); 
Query countQuery = entityManager 
     .createNamedQuery("MyEntity.getCountByState"); 
// we're telling the persistence provider that we want the query to do automatic flushing before this 
// particular query is executed. 
countQuery.setParameter("stateId", State.CHECKING); 
Long count = (Long) countQuery.getSingleResult(); 
// Count should be zero but isn't. It doesn't see my change above 

Répondre

1

Pour être honnête, je ne suis pas familier avec JPA, mais j'ai rencontré des problèmes similaires avec le gestionnaire de session de Hiberate. Mon problème était de supprimer manuellement l'objet spécifié de la session de Hibernate avant de l'interroger de nouveau, il est donc obligé de faire une recherche depuis la base de données et ne récupère pas l'objet du cache. Vous pourriez essayer de faire la même chose avec EntityManager de JPA.

0

Je viens d'avoir la même question et a découvert deux choses:

  • Tout d'abord, vous devez vérifier la FlushMode dans le contexte de persistance et/ou la requête.
  • Deuxièmement, assurez-vous que le gestionnaire d'entités est exactement le même objet pour la gestion des transactions et l'exécution de la requête . Dans mon cas, Mockito espionnait le entityManager, ce qui était suffisant pour rompre la gestion des transactions.