据我所知,Hibernate Envers当您创建、更改或删除带有@Audited 注释的对象时,存储修订版本。
Envers 自动将修订日期设置为当前时间。可以手动设置这个时间吗?
我需要它来处理数据具有有效时间的临时集合,我需要手动设置。
最佳答案
可以,但一开始可能看起来不太直观。
当 Envers 创建其修订实体实例时,会发生几件事。
@RevisionTimestamp
带注释的属性设置为当前时间。- 调用可选的
RevisionListener
并提供修订实体实例。
您可以通过两种方式指定 RevisionListener
,这实际上取决于您当前是否提供自定义修订实体实例或使用 Envers 实例根据您的设置进行解析。
提供自定义修订实体
在这种情况下,您可以通过在实体类的 @RevisionEntity
类注释上设置 RevisionListener
来指定它。
@RevisionEntity(YourCustomRevisionListener.class)
public class CustomRevisionEntity {
...
}
通过配置提供 RevisionListener
在这种情况下,您需要通过 hibernate.properties
文件或在显式设置 Hibernate 配置属性的代码中为 Hibernate 添加额外的引导配置属性:
org.hibernate.envers.revision_listener=com.company.envers.YourCustomRevisionListener
无论您采用哪种方法,您都将实现监听器的契约(Contract)并根据您的应用程序需要的任何规则显式设置时间戳值:
public class YourCustomRevisionListener implements RevisionListener {
@Override
public void newRevision(Object revisionEntity) {
// I am going to assume here you're using a custom revision entity.
// If you are not, you'll need to cast it to the appropriate class implementation.
final CustomRevisionEntity revisionEntityImpl = (CustomRevisionEntity) revisionEntity;
revisionEntityImpl.setTimestamp( resolveValidTimestampValue() );
}
private long resolveValidTimestampValue() {
// implement your logic here.
}
}
这里有一些注意事项。如果您需要解析应用程序空间中某个 bean 的值,您需要确定以下哪一项适用于您:
使用 5.3 之前的 Hibernate Envers 版本
在这种情况下,您必须使用 ThreadLocal 变量的传统方法来传递应用程序范围实例/值以访问监听器内的实例/值。
将 Hibernate Envers 5.3 或更高版本与 CDI 结合使用
在这种情况下,您可以简单地使用 CDI 的注入(inject)来注入(inject) CDI bean,因为我们添加了在创建监听器实例时自动解析 CDI bean 的支持。
将 Hibernate Envers 5.3 或更高版本与 Spring 5.1+ 结合使用
您可以使用 Spring 的注入(inject)注释将 spring bean 直接注入(inject)到监听器中,就像监听器是 spring-bean 一样。
将 Hibernate Envers 5.3 或更高版本与 Spring 5.1 之前的版本一起使用
在这种情况下,您需要使用 ThreadLocal 变量的传统方法,因为 Spring Framework 直到 5.1 才添加对将 Bean 注入(inject) Hibernate Bean 的支持。
关于java - 使用 Hibernate Envers 手动设置修订日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55871335/