据我所知,当您创建,更改或删除使用@Audited注释的对象时,Hibernate Envers会存储修订版。
Envers自动将修订日期设置为当前时间。可以手动设置这个时间吗?
我需要这个来处理数据有效时间的时间集合,我需要手动设置。
你可以,但一开始可能看起来不太直观。
当Envers创建其修订实体实例时,会发生一些事情。
@RevisionTimestamp
注释属性设置为当前时间。RevisionListener
被调用并提供了revision-entity实例。您可以通过两种方式指定RevisionListener
,这实际上取决于您当前提供的自定义修订实体实例或使用实例Envers是否根据您的设置进行解析。
在这种情况下,您可以通过在实体类的RevisionListener
类注释上设置@RevisionEntity
来指定它。
@RevisionEntity(YourCustomRevisionListener.class)
public class CustomRevisionEntity {
...
}
在这种情况下,您需要为Hibernate添加额外的引导程序配置属性,可以通过hibernate.properties
文件,也可以在显式设置hibernate配置属性的代码中:
org.hibernate.envers.revision_listener=com.company.envers.YourCustomRevisionListener
无论采用哪种方法,您都将实现侦听器的契约,并根据应用程序所需的规则显式设置时间戳值:
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解析值,则需要确定以下哪个适用于您:
在这种情况下,您将不得不使用ThreadLocal变量的传统方法来传递应用程序范围实例/值以访问侦听器内的那些。
在这种情况下,您可以使用CDI注入简单地注入CDI bean,因为我们在创建侦听器实例时添加了自动解析CDI bean的支持。
你可以使用Spring的注入注释将spring bean直接注入到监听器中,就像监听器是一个spring-bean一样。
在这种情况下,您需要使用ThreadLocal变量的遗留方法,因为Spring Framework没有添加对将bean注入Hibernate bean的支持,直到5.1。