【发布时间】:2013-11-29 10:52:02
【问题描述】:
我最近遇到了一个有趣的问题。我在项目中使用 JPA + Hibernate + EJB。该问题涉及在同一事务中保存和删除实体。使用的数据库表具有在两列上定义的唯一约束。
我所做的是删除实体调用
entityManager.remove();
然后将新实体添加到与唯一约束中使用的列关联的两个属性中的相同值,但在其他属性中使用不同的值:
entityManager.persist();
这两个操作在单个事务中执行,并按上述顺序执行。先去除,再添加。然而,由于违反了唯一约束,这些操作似乎以相反的顺序执行。看起来新实体是在删除前一个实体之前添加的。
显然,我可以打电话
entityManager.flush()
在移除之后,然后约束不被违反。但是在这种情况下,数据会在整个事务提交之前保存到数据库中。这不是一个理想的行为。如果刷新后出现任何问题,事务将被标记为回滚,则实体将被删除。
我认为操作顺序与添加到事务中的顺序相同。从我的例子来看,事实并非如此。
有什么方法可以在删除后不刷新或提交事务的情况下解决问题?
谢谢。
【问题讨论】:
标签: java hibernate jpa transactions ejb