J'écris une application pour GlassFish 2.1.1 (JavaEE 5, JPA 1.0, pour autant que je sache). Je le code suivant dans mon servlet (que je la plupart du temps emprunté à un certain échantillon sur Internet):EntityManager ne voit pas les changements effectués dans d'autres transactions
@PersistenceContext(name = "persistence/em", unitName = "pu")
private EntityManager em;
@Resource
private UserTransaction utx;
@Override
protected void doPost(...) {
utx.begin();
. . . perform retrieving operations on em . . .
utx.rollback();
}
web.xml
a ce qui suit dans le:
<persistence-context-ref>
<persistence-context-ref-name>persistence/em</persistence-context-ref-name>
<persistence-unit-name>pu</persistence-unit-name>
</persistence-context-ref>
Le problème est, l'em n » t voir les changements qui ont été faits dans une autre transaction extérieure. En gros, je fais une demande à mon servlet à partir du navigateur Web, voir les données, effectuer une certaine DML dans la console SQL, recharger la page de servlet - et il ne montre aucune modification. J'ai essayé d'utiliser de nombreuses combinaisons de em.flush
, et utx.rollback
, et em.joinTransaction
, mais cela ne semble pas faire du bien.
La situation est compliquée par le fait que je suis un débutant total en JPA, donc je ne comprends pas très bien comment fonctionnent les machines sous-jacentes. Donc toute aide et - plus important encore - les explications/liens de ce qui se passe là-bas seraient très appréciés. Merci!
« Lorsque vous effectuez des opérations dans une autre transaction sans utiliser JPA, le cache n'est plus à jour » - Est-ce que cela signifie que J'avais utilisé JPA pour modifier les données dans le cas mentionné ci-dessus (et pas un outil externe), je verrais des changements après avoir rechargé la page de servlet? –
@Andy, oui vous le feriez. L'EntityManager est en effet responsable de la maintenance du cache. Vous pourriez trouver utile le guide des concepts de JPA sur OpenEJB - http://openejb.apache.org/3.0/jpa-concepts.html. –