首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用@EntityListeners记录@EntityListeners的更改?

如何使用@EntityListeners记录@EntityListeners的更改?
EN

Stack Overflow用户
提问于 2019-03-27 17:35:16
回答 2查看 491关注 0票数 1

我想创建一个记录器来记录实体上的任何CRUD操作。这在insertdelete上很容易。但是我如何在update过程中访问之前的实体,这样我就可以记录更改的字段(例如通过反射访问)。

代码语言:javascript
复制
@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)?
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-11 21:41:05

您可以将previousState保存在PostLoad方法中,并在PreUpdate方法中检查差异

代码语言:javascript
复制
// 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();
}

}

票数 1
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
// 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的类名。示例:

代码语言:javascript
复制
com.company.my.ImplementedHibernateIntegrator

其他版本的Hibernate可能有不同的方法,例如https://vladmihalcea.com/hibernate-event-listeners/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55373885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档