JPA 2.0 Eclipselink-添加/删除子列表获得乐观锁定
我遇到了一个问题,eclipselink(2.5)抛出了一个OptimisticLockException,尽管我正在修改的唯一内容是尝试从子列表中添加或删除项目 实体:JPA 2.0 Eclipselink-添加/删除子列表获得乐观锁定,jpa,eclipselink,spring-data-jpa,Jpa,Eclipselink,Spring Data Jpa,我遇到了一个问题,eclipselink(2.5)抛出了一个OptimisticLockException,尽管我正在修改的唯一内容是尝试从子列表中添加或删除项目 实体: @Entity @Table(name="PLAN_ORG_RELATIONSHIP") @Customizer(GridCacheCustomizer.class) @AdditionalCriteria("CURRENT_TIMESTAMP BETWEEN this.startDate AND
@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;
}
我有3个路径-添加与动作的新关系(两个实体都是新的)或添加动作或删除动作
当我同时添加这两个元素时,我发现父元素和子元素也会被持久化,这是预期的行为。
当我尝试添加或删除时,我会尝试以下操作
PrismOrganizationRelationship por = findById (..) //we are spring-data-jpa
por.addPlanOrganizationAction(action);
repo.save(por); // Throws optimistic lock - even though @Version is the same
不确定导致此问题的原因是什么?检查
cascade=CascadeType.PERSIST
。它仅适用于持久化(保存新实体)操作。您的操作删除子实体意味着更新主实体。这就是为什么,您需要使用CascadeType.MARGE`进行更新操作。能否打开EclipseLink日志并显示为事务记录的SQL,特别是导致异常的语句?James在这里描述了应该发生的事情,但提到行为是可配置的-检查您的自定义程序是否没有将锁行为更改为级联。我已将日志记录设置为罚款,但它实际上没有记录插入的sql,因为它首先抛出OptimisticLockException。您不显示查找或保存方法的工作方式,因此,如果它们使用不同的上下文,por实例可能会过时,这将导致在新上下文中合并时出现optistic锁异常。尝试检查save方法的功能,以及调用之前和之后(但在异常之前)对象的状态。您还可以尝试em.refresh()以查看状态是否不同。例外情况是否提供了任何其他信息?异常是否由子对象中的更改引起?
PrismOrganizationRelationship por = findById (..) //we are spring-data-jpa
por.addPlanOrganizationAction(action);
repo.save(por); // Throws optimistic lock - even though @Version is the same