0

我们将 Hibernate 5.3.13 与 Spring Data JPA 2.1.12 一起使用,并且当有一个已经持久化、托管的最小实体时,如下所示:

@Entity
@Table(name = "EventsHolder")
@Access(AccessType.FIELD)
class EventsHolder {
    @LastModifiedDate
    @Column(name = "modifiedon", nullable = false)
    @Temporal(TIMESTAMP)
    @Access(AccessType.FIELD)
    Date modifiedOn;

    @Version
    @Column(name = "optlock", nullable = false)
    @Access(AccessType.FIELD)
    long optimisticLockingVersion = 0L;

    @Embedded
    Events events = new Events();

包含以下内容Embeddable

@Embeddable
@Access(AccessType.FIELD)
class Events {

    @OneToMany(mappedBy = ...)
    @OrderBy("id ASC")
    @BatchSize(size = 10)
    List<Event> events = new LinkedList<>();

现在,每当使用添加到集合中的已持久化托管事件进行调用EventsHolder.events.add(...)时,休眠 - 在进行自动刷新时 - 将检测到该EventsHolder.Events.events集合是脏的org.hibernate.event.internal.DefaultFlushEntityEventListener#hasDirtyCollections ,并将发出(不确定这是否是这里的重要先决条件)一个 Pre -更新对 Spring Data 的 AuditingHandler 的调用,它将更新 modifiedOn。

最后,optimisticLockingVersion 会增加,hibernate 会发出一个更新语句,基本上只更新修改后的版本和版本。

使用包含 5000 个事件的 EventsHolder,我们看到 optlock-versions 大约在 4500-5000 左右,并且数据库的审计日志被所说的“非更新”所困扰,这些“非更新”仅更新修改后的版本和乐观锁定版本。

任何关于如何阻止这种行为的想法都非常感谢。

4

1 回答 1

0

通过删除间接 -Events仅包含 @OneToMany 字段的嵌入并将其直接内联到实体中 - 脏检查不再连续检测集合为脏,现在一切都很好。

于 2019-12-21T12:31:13.567 回答