EJB Transaction误解

时间:2016-02-27 10:43:30

标签: java java-ee transactions ejb commit

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

ADD     R0, R0, R0, LSL #1

我有以下异常

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

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

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

我做错了什么?

UPD:JPA实现是EclipseLink

1 个答案:

答案 0 :(得分:2)

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

发生了什么(EclipseLink也是如此):

Hibernate只看到事务的持久化上下文内存中发生的事情,而没有刷新它无法预先验证数据库约束(在这种情况下是主键)。 虽然Hibernate完全知道你已经删除了具有相同ID的项目(因为它发生在相同的持久化上下文中),但是在刷新之前,DB没有看到任何更改。

现在你会认为,为什么在交易结束之前,在提交之前让冲洗自动发生是不够的?当然,DB操作的顺序将与JPA操作一致,并且DB将在插入之前看到行删除。好吧,它不会,Hibernate正在改变你的操作顺序,它会在删除之前将所有插入破坏数据库约束:http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/event/def/AbstractFlushingEventListener.html#performExecutions%28org.hibernate.event.EventSource%29