java - EJB事务误解

标签 java jakarta-ee transactions ejb commit

我正在调用 SLSB 方法,该方法的事务由容器控制。 在方法中,我尝试删除实体并创建新实体

List<FactPlan> factPlans = factPlanFacadeLocal.findAll();

for (FactPlan factPlan : factPlans) {
    factPlanFacadeLocal.remove(factPlan);
}

FactPlan factPlan = new FactPlan(12264L, 12088L);
factPlanFacadeLocal.create(factPlan);

我有以下异常

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "pkfact_plan"
Detail: Key (fact_id, plan_id)=(12264, 12088) already exists.

我做错了什么?

UPD:JPA 实现是 EclipseLink

最佳答案

编辑: 我说你需要提交是错误的,在删除操作之后刷新就足够了,以确保不违反数据库约束。

发生了什么(EclipseLink 也完全相同):

Hibernate 仅查看事务持久性上下文内内存中发生的情况,如果不刷新,它无法抢先验证数据库约束(在本例中为主键)。 虽然 Hibernate 完全知道您已经删除了具有相同 ID 的项目(因为这一切都发生在同一个持久性上下文中),但数据库在刷新之前看不到您的任何更改。

现在您可能会想,为什么在事务结束时、提交之前让刷新自动发生还不够?当然,数据库操作的顺序将与 JPA 操作一致,并且数据库将在插入之前看到行删除。好吧,它不会,Hibernate 正在改变你的操作顺序,它把所有插入放在删除之前,打破了数据库约束:http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/event/def/AbstractFlushingEventListener.html#performExecutions%28org.hibernate.event.EventSource%29

关于java - EJB事务误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35668724/

相关文章:

java - 野蝇 - @TransactionAttribute -

java - 如何将 pdf/images 存储到 HBase 表

java - 字符串对象是不可变的,但引用变量是可变的。这意味着什么?

java - 如何使用 Java 将电子表格列转换为行

sql - 围绕单个语句的事务有什么作用?

php - MySQL 查询不起作用

java - 如何通过我的应用程序在 soundcloud 中上传音频,我想将该 id 也发送到我的服务器

java - NetBeans 在 JSP 中的 src ="<%=request.getContextPath()%>/images/image.png"中报告错误

java - 在java中部署Web服务

java - 简单的 websocket 和静态文件示例