【发布时间】:2015-01-08 18:30:58
【问题描述】:
我遇到了一个问题,即 eclipselink (2.5) 抛出 OptimisticLockException,即使我唯一要修改的是尝试从子列表中添加或删除项目。
实体:
@Entity
@Table(name="PLAN_ORG_RELATIONSHIP")
@Customizer(GridCacheCustomizer.class)
@AdditionalCriteria("CURRENT_TIMESTAMP BETWEEN this.startDate AND this.endDate")
@NamedQuery(name="PlanOrganizationRelationship.findAll", query="SELECT p FROM PlanOrganizationRelationship p")
@Portable
public class PlanOrganizationRelationship extends PrismObject implements Serializable {
@OneToMany(mappedBy="planOrganizationRelationship", cascade=CascadeType.PERSIST, orphanRemoval=true)
@PortableProperty(10)
private List<PlanOrganizationAction> planOrganizationActions;
public PlanOrganizationAction addPlanOrganizationAction(PlanOrganizationAction planOrganizationAction) {
getPlanOrganizationActions().add(planOrganizationAction);
planOrganizationAction.setPlanOrgRelationship(this);
return planOrganizationAction;
}
public PlanOrganizationAction removePlanOrganizationAction(PlanOrganizationAction planOrganizationAction) {
getPlanOrganizationActions().remove(planOrganizationAction);
planOrganizationAction.setPlanOrgRelationship(null);
return planOrganizationAction;
}
@Column(name="LST_UPDT_DT")
@Version
@PortableProperty(5)
private Timestamp lastUpdatedDate;
}
一对多的另一面:
@Entity
@Table(name="PLAN_ORGANIZATION_ACTION")
@Customizer(GridCacheCustomizer.class)
@AdditionalCriteria("CURRENT_TIMESTAMP BETWEEN this.startDate AND this.endDate")
@NamedQuery(name="PlanOrganizationAction.findAll", query="SELECT p FROM PlanOrganizationAction p")
@Portable
public class PlanOrganizationAction extends PrismObject implements Serializable {
@ManyToOne
@JoinColumn(name="PLN_ORG_RLTNP_SEQ_ID")
@PortableProperty(7)
private PlanOrganizationRelationship planOrganizationRelationship;
}
我有 3 条路径 - 添加与操作的新关系(两个实体都是新的)或添加操作或删除操作
当我同时添加两者时,我坚持父母和孩子也坚持,这是预期的行为。 当我尝试添加或删除时,我会尝试类似
PrismOrganizationRelationship por = findById (..) //we are spring-data-jpa
por.addPlanOrganizationAction(action);
repo.save(por); // Throws optimistic lock - even though @Version is the same
不确定是什么导致了这个问题?
【问题讨论】:
-
你能打开 EclipseLink 日志并显示为事务记录的 SQL,特别是导致异常的语句吗? James 描述了dev.eclipse.org/mhonarc/lists/eclipselink-users/msg04356.html 此处应该发生的情况,但提到该行为是可配置的 - 检查您的自定义程序是否没有将锁定行为更改为级联。
-
我的日志记录设置得很好,但它实际上并没有记录插入的 sql,因为它首先抛出了 OptimisticLockException
-
您没有展示 find 或 save 方法是如何工作的,因此如果它们使用不同的上下文,则 por 实例可能是陈旧的,这会导致在新上下文中合并时出现光学锁定异常。尝试检查 save 方法的作用,以及调用之前和之后(但在异常之前)的对象状态。您也可以尝试使用 em.refresh() 来查看状态是否不同。例外是否提供任何其他信息?会不会是子对象的变化引起的异常?
标签: jpa eclipselink spring-data-jpa