我们将 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 左右,并且数据库的审计日志被所说的“非更新”所困扰,这些“非更新”仅更新修改后的版本和乐观锁定版本。
任何关于如何阻止这种行为的想法都非常感谢。