我想创建一个记录器来记录实体上的任何CRUD操作。这在insert或delete上很容易。但是我如何在update过程中访问之前的实体,这样我就可以记录更改的字段(例如通过反射访问)。
@Entity
@EntityListeners(AuditingEntityListener.class)
public class MyEntity {
}
public class AuditEntityListener {
private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
private static final Marker AUDIT = MarkerFactory.getMarker("AUDIT");
@PrePersist
public void prePersist(Object target) {
log("new object inserted", target);
}
@PreRemove
public void preRemove(Object target) {
log("entity deleted", target);
}
@PreUpdate
public void preUpdate(Object target) {
//TODO how can I access the "old" entity, so that I can log only changed fields (eg via reflection)?
}
}发布于 2019-04-11 21:41:05
您可以将previousState保存在PostLoad方法中,并在PreUpdate方法中检查差异
// EDIT
@Entity
@EntityListeners(AuditingEntityListener.class)
public class MyEntity {
@Transient
private transient MyEntity savedState;
}
public class AuditEntityListener {
private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
private static final Marker AUDIT = MarkerFactory.getMarker("AUDIT");
@PostLoad
private void saveState(MyEntity target){
target.savedState = SerializationUtils.clone(target);
}
@PrePersist
public void prePersist(MyEntity target) {
log("new object inserted", target);
}
@PreRemove
public void preRemove(MyEntity target) {
log("entity deleted", target);
}
@PreUpdate
public void preUpdate(MyEntity target) {
MyEntity previousState = target.getSavedState();
}}
发布于 2019-03-27 17:58:20
尝试查看Hibernate的事件SPI。Hibernate Envers实现了一些提供的SPI。我目前使用的是Hibernate 5。
实现org.hibernate.event.spi.PostUpdateEventListener接口,该接口将重写public void onPostUpdate(PostUpdateEvent event)。PostUpdateEvent可以让你访问一些有用的东西,例如PostUpdateEvent#getOldState()。
完成后,您需要将该侦听器注册到SPI集成器。实施org.hibernate.integrator.spi.Integrator。
// Overriden public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory,
// SessionFactoryServiceRegistry serviceRegistry)
final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);
eventListenerRegistry.appendListeners(EventType.POST_UPDATE, YourListener.INSTANCE);然后通过创建META-INF/services/org.hibernate.integrator.spi.Integrator在应用程序中注册该集成器。在这个文件中,您需要输入已实现的Hibernate Integrator的类名。示例:
com.company.my.ImplementedHibernateIntegrator其他版本的Hibernate可能有不同的方法,例如https://vladmihalcea.com/hibernate-event-listeners/
https://stackoverflow.com/questions/55373885
复制相似问题