【问题标题】:OptimisticLocking and @OneToMany(mappedBy=...) handling?OptimisticLocking 和 @OneToMany(mappedBy=...) 处理?
【发布时间】:2009-10-29 00:53:07
【问题描述】:

我有一个 AbstractEntity 类作为我的所有实体的超类,它定义了一个如下所示的乐观锁列:

@Version
private long lockVersion;

现在我经常在实体上遇到 OptimisticLockingExceptions,它们仅在类似于以下的 mappedBy 关系中发生了变化:

@OneToMany(mappedBy = Property.PROPERTY_DESCRIPTOR, cascade = { CascadeType.REMOVE })
private Set<Property> properties = new HashSet<Property>();

是否可以从 Hibernate 乐观锁定中排除这些集合?实体在数据库中根本没有改变......只有其他人引用它。

【问题讨论】:

    标签: java hibernate locking


    【解决方案1】:

    您可以通过@OptimisticLock 注释明确排除某个特定属性(和/或集合),使其不增加版本号:

    @OptimisticLock(excluded=true)
    @OneToMany(mappedBy = Property.PROPERTY_DESCRIPTOR, cascade = { CascadeType.REMOVE })
    private Set<Property> properties = new HashSet<Property>();
    

    请注意,它是 JPA 标准的 Hibernate 扩展。

    【讨论】:

    • 我已将此注释添加到所有不级联合并或持久化的 mappedBy 集合中。另一种解决方案是区分用于非托管实体的 entity.getCollection().add(...) 和用于托管实体的 em.refresh(entity)。这也避免了锁定问题。
    【解决方案2】:

    我认为这个问题中接受的答案应该对你有所帮助:link

    虽然我自己没有尝试过,但是可以检测到不需要更新版本并且不增加版本的更改。

    【讨论】:

    • 嗯可能是......但我希望某种注释或休眠功能来解决这个问题......我们拭目以待。
    猜你喜欢
    • 2017-01-23
    • 2022-01-23
    • 1970-01-01
    • 2010-11-15
    • 2016-07-22
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多