获取原始实体触发的休眠事件

时间:2019-05-06 12:38:42

标签: hibernate spring-data-jpa

我在Hibernate上使用带有JPA 2的Spring Boot 2。我想记录一些审计信息,但不仅要记录实际实体,还要记录有关父实体的信息。

例如:我有一个Employee实体和一个Address实体。因此,如果Address实体发生更改,我也想记录Employee已更改。 Employee是被保存的实体,即使它不脏。

我发现了一些类似的问题: Hibernate versioning parent entity 仅当子实体了解父实体时,此方法才有效。

我还发现了这一点:https://thoughts-on-java.org/hibernate-tips-increase-version-parent-entity-updating-child-entity/ 该解决方案是一种情况的具体实现,但我想要一个通用解决方案。

我的想法是找到原始实体,如果它的任何子实体很脏,那么也要标记原始实体。

2 个答案:

答案 0 :(得分:1)

我遇到了几乎相同的问题。我希望当子实体更改时,所属实体的“ lastModifiedDate”和“ Version”字段会更新。我正在使用Spring Data JPA审核。

我已经测试了很多东西并实现了许多自定义代码。甚至我都在尝试实现自定义的脏检查机制。我可以通过遵循此blog post来修复父版本,但对审核没有任何作用。

最后,使用 Hibernate Bytecode Enhancement Maven插件并启用 DirtyTracking ,为我解决了父版本控制和审核的问题。现在,当我编辑子级时,拥有实体的“ lastModifiedDate”和“版本”会自动更新,而无需任何自定义代码。请记住,我仅测试过ManyToOne / OneToMany关系,但我认为这也应适用于其他关系。另外,我正在通过JpaRepository(使用Spring Data)从拥有方更新实体

要启用休眠字节码增强功能,请将此插件添加到您的POM文件中:

<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>${hibernate.version}</version>
<executions>
    <execution>
        <configuration>
            <failOnError>true</failOnError>
            <enableDirtyTracking>true</enableDirtyTracking>
            <enableAssociationManagement>false</enableAssociationManagement>
            <enableExtendedEnhancement>false</enableExtendedEnhancement>
            <enableLazyInitialization>false</enableLazyInitialization>
        </configuration>
        <phase>compile</phase>
        <goals>
            <goal>enhance</goal>
        </goals>
    </execution>
</executions>

现在,当您查找“目标”文件夹时,实体现在通过使用SelfDirtinessTracker实现 ManagedEntity和SelfDirtinessTracker ,这些实体会跟踪脏字段,无需休眠即可检查所有实体以查找脏对象那些。除了为我修复父级审核和版本控制外,这还可以提高性能。希望它也能解决您的问题。

答案 1 :(得分:0)

我欺骗了系统。每当我更改/删除/添加OneToMany子实体时,我都会呼叫entity.setLastModifiedDate(myDateProvider.now())

这使我的父实体变脏了,Hibernate增加了版本,我从AuditorAware获得了新的正确的lastModifiedDate和lastModifiedBy值。

对于此问题,这可能是一种简单,快速且肮脏的解决方案。