我正在调用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
答案 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