【问题标题】:JPA 2.0 Eclipselink - Adding/Deleting to child list gets optimistic lockJPA 2.0 Eclipselink - 添加/删除到子列表获得乐观锁定
【发布时间】: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


【解决方案1】:

检查cascade=CascadeType.PERSIST。它仅适用于持久(保存新实体)操作。您的操作删除子实体意味着更新主实体。 Thats why, you need to useCascadeType.MARGE`进行更新操作。

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2021-09-27
    相关资源
    最近更新 更多