我正在为GlassFish 2.1.1(据我所知JavaEE 5,JPA 1.0)编写一些应用程序。我的servlet中有以下代码(我主要从Internet上的某些示例借来的):
@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 包含以下内容:
web.xml
<persistence-context-ref> <persistence-context-ref-name>persistence/em</persistence-context-ref-name> <persistence-unit-name>pu</persistence-unit-name> </persistence-context-ref>
问题是,em看不到另一个外部事务中所做的更改。大致来说,我从Web浏览器向Servlet发出请求,查看数据,在SQL控制台中执行一些DML,重新加载Servlet页面- 它没有显示任何更改。我尝试使用em.flush,和utx.rollback,和的许多组合em.joinTransaction,但似乎没有任何用处。
em.flush
utx.rollback
em.joinTransaction
由于我是JPA的新手,因此情况变得很复杂,因此我对底层机制的工作方式不甚了解。因此,非常感谢您提供任何帮助,更重要的是,对正在发生的事情的解释/链接。谢谢!
JPA实现维护了已访问实体的缓存。当您在不使用JPA的情况下在其他事务中执行操作时,缓存不再是最新的,因此您永远不会看到其中所做的更改。
如果您确实希望看到更改,则必须刷新缓存,在这种情况下,所有实体都将从缓存中逐出。当然,您需要知道何时执行此操作(在另一个事务完成之后),否则您将继续看到模棱两可的实体。如果这是您的业务需求,那么JPA可能不适合您的问题领域。