我在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/ 该解决方案是一种情况的具体实现,但我想要一个通用解决方案。
我的想法是找到原始实体,如果它的任何子实体很脏,那么也要标记原始实体。
答案 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值。
对于此问题,这可能是一种简单,快速且肮脏的解决方案。