如何自动记录@Entity上的任何更改?

时间:2015-04-09 09:00:38

标签: java spring hibernate jpa

我想定义一个@Entity,其更改(CRUD操作)应记录到文本文件中。 是否有任何框架可以与spring一起使用?

我知道Envers,但这会增加数据库表中的历史条目。但我只想记录日志,没有版本跟踪。

我主要使用spring CrudRepository接口进行CRUD操作。

3 个答案:

答案 0 :(得分:2)

您可以查看可以记录jpa生命周期的JPA EntityListeners

您可以在同一课程中注明lifecycle callback methods

使用生命周期回调方法

@Entity
public class Employee {

@TableGenerator(name = "employee_gen", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize = 1,table="id_gen")
@Id
@GeneratedValue(generator = "employee_gen", strategy = GenerationType.TABLE)
private int idEmployee;

private String firstName;
private String lastName;
private int salary;

public int getIdEmployee() {
    return idEmployee;
}

public void setIdEmployee(int idEmployee) {
    this.idEmployee = idEmployee;
}

// gettrs and setters

@PrePersist
public void methodInvokedBeforePersist() {
    System.out.println("Invoked before persisting employee");
}

@PostPersist
public void methodInvokedAfterPersist() {
    System.out.println("Invoked after persisting employee");
}

@PreUpdate
public void methodInvokedBeforeUpdate() {
    System.out.println("Invoked before updating employee");
}

@PostUpdate
public void methodInvokedAfterUpdate() {
    System.out.println("Invoked after updating employee");
}

@PreRemove
public void methodInvokedBeforeRemove() {
    System.out.println("Invoked before removing employee");
}

@PostRemove
public void methodInvokedAfterRemove() {
    System.out.println("Invoked after removing employee");
}

  }

使用单独的EntityListener类 假设您有要监听其生命周期的Employee实体

@Entity
@EntityListeners(EmployeeLoggingListener.class)
public class Employee{...}

EmployeeLoggingListerner 如下

public class EmployeeLoggerListener {

    @PrePersist
    public void methodInvokedBeforePersist(Employee emp) {
        System.out.println("persisting employee with id = " + emp.getIdEmployee());
    }

    @PostPersist
    public void methodInvokedAfterPersist(Employee emp) {
        System.out.println("Persisted employee with id = " + emp.getIdEmployee());
    }

    @PreUpdate
    public void methodInvokedBeforeUpdate(Employee emp) {
        System.out.println("Updating employee with id = " + emp.getIdEmployee());
    }

    @PostUpdate
    public void methodInvokedAfterUpdate(Employee emp) {
        System.out.println("Updated employee with id = " + emp.getIdEmployee());
    }

    @PreRemove
    private void methodInvokedBeforeRemove(Employee emp) {
        System.out.println("Removing employee with id = " + emp.getIdEmployee());
    }

    @PostRemove
    public void methodInvokedAfterRemove(Employee emp) {
        System.out.println("Removed employee with id = " + emp.getIdEmployee() );
    }

 }

答案 1 :(得分:0)

您可以使用实体侦听器。

添加到基类(所有实体类应该扩展)的方法标记为例如 @PrePersist或@PostUpdate

并在那里写下你的日志

请参阅herehere

答案 2 :(得分:0)

您应该查看Hibernate interceptors,当您必须对与持久性相关的事件作出反应时,它是有用的,提供的回调是

  
      
  • onSave - 保存对象时调用,该对象不保存   数据库呢。
  •   
  • onFlushDirty - 更新对象时调用,   对象尚未更新到数据库中。
  •   
  • onDelete - 删除对象时调用,该对象尚未删除到数据库中。
  •   
  • preFlush - 在保存,更新或删除的对象被提交到数据库之前调用(通常在postFlush之前)。
  •   
  • postFlush - 之后调用   保存,更新或删除的对象将提交到数据库。
  •   

here你可以找到一个基于Hibernate拦截器的exemplery审计日志实现