java - 如何使用@EntityListeners记录@Entity更改?

标签 java hibernate

我想创建一个记录器来记录实体上的任何 CRUD 操作。 插入删除很容易。但是我如何在更新过程中访问以前的实体,以便我可以记录更改的字段(例如通过反射访问)。

@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)?
    }
}

最佳答案

您可以将 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();
}

}

关于java - 如何使用@EntityListeners记录@Entity更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55373885/

相关文章:

java - 从 double 列表创建坐标

java - 使用实体监听器测量数据库操作所花费的时间

java - hibernate 如何从现有数据库 View 中检索数据?

java - Hibernate:通过示例和多对一关系进行查询

java - 将映射中具有最低值的键转置到集合中

java - JAX-B - 如何将模式元素映射到现有 Java 类

java - 如何以编程方式在 cookie 上设置安全标志

java - 从查询中分离列表

java - Hibernate query.list() 方法返回空列表而不是空值

java - 在 ArrayList Java 中搜索特定对象