Ich schreibe eine Anwendung für GlassFish 2.1.1 (JavaEE 5, JPA 1.0, soweit ich weiß). Ich habe den folgenden Code in meinem Servlet (was ich meist aus einem Probe auf dem Internet ausgeliehen):EntityManager sieht keine Änderungen in anderen Transaktionen
@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
hat es die folgenden:
<persistence-context-ref>
<persistence-context-ref-name>persistence/em</persistence-context-ref-name>
<persistence-unit-name>pu</persistence-unit-name>
</persistence-context-ref>
Das Problem ist, die em doesn‘ t Änderungen sehen, die in einer anderen, externen Transaktion vorgenommen wurden. Grob gesagt, erstelle ich eine Anfrage an mein Servlet vom Webbrowser, sehe Daten, führe etwas DML in der SQL-Konsole durch, lade die Servletseite neu - und es werden keine Änderungen angezeigt. Ich habe versucht, viele Kombinationen von em.flush
und utx.rollback
und em.joinTransaction
zu verwenden, aber es scheint nicht zu tun.
Die Situation ist kompliziert, da ich ein absoluter Neuling in JPA bin, so dass ich kein klares Verständnis davon habe, wie die zugrunde liegenden Maschinen funktionieren. Jede Hilfe und - was noch wichtiger ist - Erklärungen/Links zu dem, was dort passiert, wären sehr willkommen. Vielen Dank!
„Wenn Sie Operationen in einer anderen Transaktion durchführen, ohne JPA zu verwenden, ist der Cache nicht mehr up to date“ - es bedeutet, dass Ich hatte JPA benutzt, um Daten in vorher erwähntem Fall zu ändern (und nicht irgendein externes Werkzeug), würde ich Änderungen sehen, nachdem ich Servletseite wiederladen? –
@Andy, ja du würdest. Der EntityManager ist tatsächlich für die Verwaltung des Cache verantwortlich. Sie finden den JPA Concepts Guide unter OpenEJB - http://openejb.apache.org/3.0/jpa-concepts.html als nützlich. –