gpt4 book ai didi

JPA/EclipseLink : Does EntityManager. getTransaction() 创建新交易还是返回事件交易?

转载 作者:行者123 更新时间:2023-12-03 23:55:20 26 4
gpt4 key购买 nike

我正在使用 EclipseLink 2.3.0。我有一个从单元测试调用的方法(因此在容器之外,没有 JTA),如下所示:

EntityManager em = /* get an entity manager */;
em.getTransaction().begin();
// make some changes
em.getTransaction().commit();

更改没有被持久化到数据库中,看了很长时间,终于意识到 EntityManager.getTransaction() 实际上返回了一个 NEW EntityTransaction,而不是两个调用中的同一个。效果是第一个调用创建一个新事务并开始它,第二个调用创建另一个事务并提交它。因为第一个事务从未提交,所以不会保存更改。我们是这样验证的:
log.info(em.getTransaction().toString());
log.info(em.getTransaction().toString());

这导致了这些日志消息:
INFO: org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl@1e34f445
INFO: org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl@706a4d1a

两个不同的对象 ID 验证有两个不同的实例。把代码改成这样:
EntityManager em = /* get an entity manager */;
EntityTransaction tx = em.getTransaction();
tx.begin();
// make some changes
tx.commit();

...解决了问题。现在,当我运行代码时,我看到为执行数据库工作而生成的 SQL 语句,并在数据库中查看数据已更改。

我对这个结果感到有点惊讶,因为我在网上看到了许多代码示例(一般针对 JPA,特别是针对 EclipseLink),它们推荐了我们用于管理事务的代码。我搜索了很多关于这方面的信息,但没有找到任何东西。发生什么了?

我在 JPA 规范中查看了一些具体指定 getTransaction() 做什么的东西,并且它不是具体的交易是新的还是相同的。在persistence.xml 中是否有一个设置来控制这个?行为是否特定于 JPA 规范的每个实现?

非常感谢您提供任何信息或指导。

最佳答案

使用 getTransaction() 在 JPA 和 EclipseLink 中确实有效(这是我们自己的测试的工作方式)。

我的猜测是你正在做一些非常奇怪的事情。

您使用的是 Spring 还是其他层?
请包括整个代码和persistence.xml 以进行测试。确保您没有在persistence.xml 中使用JTA。

关于JPA/EclipseLink : Does EntityManager. getTransaction() 创建新交易还是返回事件交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11005373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com