小编典典

EntityManager没有看到其他交易中进行的更改

java

我正在为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 包含以下内容:

<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,但似乎没有任何用处。

由于我是JPA的新手,因此情况变得很复杂,因此我对底层机制的工作方式不甚了解。因此,非常感谢您提供任何帮助,更重要的是,对正在发生的事情的解释/链接。谢谢!


阅读 213

收藏
2020-10-16

共1个答案

小编典典

JPA实现维护了已访问实体的缓存。当您在不使用JPA的情况下在其他事务中执行操作时,缓存不再是最新的,因此您永远不会看到其中所做的更改。

如果您确实希望看到更改,则必须刷新缓存,在这种情况下,所有实体都将从缓存中逐出。当然,您需要知道何时执行此操作(在另一个事务完成之后),否则您将继续看到模棱两可的实体。如果这是您的业务需求,那么JPA可能不适合您的问题领域。

2020-10-16