gpt4 book ai didi

java - EntityManager 操作顺序

转载 作者:搜寻专家 更新时间:2023-11-01 01:52:50 27 4
gpt4 key购买 nike

我最近遇到了一个有趣的问题。我在项目中使用JPA+Hibernate+EJB。该问题涉及在同一事务中保存和删除实体。使用的数据库表具有在两列上定义的唯一约束。

我所做的是删除实体调用

entityManager.remove();

然后添加新实体,在与唯一约束中使用的列关联的两个属性中使用相同的值,但在其他属性中使用不同的值:

entityManager.persist();

这两个操作在单个事务中执行,并按上述顺序执行。先去除,再添加。然而,由于违反了唯一约束,操作似乎以相反的顺序执行。看起来新实体是在删除前一个实体之前添加的。

显然,我可以调用

entityManager.flush()

删除后约束不被违反。但是,在这种情况下,数据会在整个事务提交之前保存到数据库中。这不是一种理想的行为。如果刷新后出现任何问题,事务将被标记为回滚,实体将被删除。

我认为操作顺序与添加到交易中的顺序相同。从我的示例来看,事实并非如此。

有没有办法解决删除后不刷新或不提交事务的问题?

谢谢。

最佳答案

Obviously, I can call entityManager.flush()

实际上你必须调用它。

However in this case the data is saved to the database before the whole transaction commits.

错误的是:数据已经同步到DB了,但是事务还没有提交,除非你手动提交,对DB有控制权。如果您没有在 EJB 中配置任何东西,并且您的持久化单元是 JTA(请参阅 this question with comments),那么只有在方法从 EJB 层返回后才会提交事务。

I thought that order of operations is the same as they were added to the transaction. From my example it turns out that it is not.

不,JPA 规范不强制实现执行此操作。这就是为什么有 flush() 操作。

Is there any way to solve the issue without flushing or committing the transaction after delete?

是的,正如我所说,使用 flush()。还要确保您使用事务数据库引擎(例如 MySql 中的 MyIsam 不支持事务)。

关于java - EntityManager 操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20284027/

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