Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA 2.0 Eclipselink-添加/删除子列表获得乐观锁定_Jpa_Eclipselink_Spring Data Jpa - Fatal编程技术网

JPA 2.0 Eclipselink-添加/删除子列表获得乐观锁定

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

我遇到了一个问题,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;
}
我有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