当前位置: 首页 > 面试题库 >

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

令狐弘益
2023-03-14
问题内容

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


问题答案:

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

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



 类似资料:
  • 问题内容: 我正在尝试使用Spring @Transactional批注,但是在调用 findAll 方法时出现问题,并且出现以下错误: 人DAO: 这是我的: 我尝试删除此行,但是又出现了一个错误,为什么这行不通? 问题答案: 您必须显式声明对事务管理器注释的支持 添加到您的配置中: tx是xmlns:tx =“ http://www.springframework.org/schema/tx”

  • 我创建了一个带有jar打包的maven实用程序项目,在该项目中,我实现了EntityManager接口来管理数据库连接和其他内容。但当我想(从另一个maven项目)将其与@Inject一起使用时,它就不起作用了。 有没有办法指定要使用哪个EntityManager实现? 重要提示:如果我在主项目中包含这个实体管理器,它是有效的。但是我正在努力避免这种情况,因为将来我会有其他项目使用相同的数据库。

  • 问题内容: 我正在尝试将换行符()转换为html 。 根据Google网上论坛的讨论,这是我得到的: 那里的讨论还建议在视图中使用以下内容: 这似乎正在使用旧的过滤器,而现在我们应该使用属性。 无论如何,这都会带来一个问题:我不希望原始字符串()中的任何HTML 都呈现为HTML;只有的。 例如,给定以下字符串: 虽然7> 5,但 我仍然不希望html和其他东西出现在这里… 我希望它输出: 有什么

  • 我有一段代码可以在Windows7本机或Ubuntu16.04本机下正常工作,但是在VMPlayer6中使用Ubuntu16.04和vmwgfx,除非移动窗口,否则它不会更新。三种情况下的代码完全相同。 节点这是旧的JOGL 1 http://jogamp.org/deployment/archive/master/gluegen-old-1.0b6/gluegen-rt-natives-linu

  • 问题内容: 我试图使声明式交易工作。 这是我的spring.xml文件: 这是我的控制器实现: 两者都在称为test的包中。 这是我的尝试: 但这引发了异常: org.hibernate.HibernateException:如果没有活动事务,createQuery无效 为什么transactionManager不起作用?我希望使用@Transactional批注将所有事务由Spring框架管理。