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

mem*_*und 2 java spring hibernate jpa

我想定义一个@Entity应该将其更改(CRUD 操作)记录到文本文件中的对象。有没有我可以结合使用的框架spring

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

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

Pra*_*kar 5

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

您可以在同一个类中注释生命周期回调方法,如下所示

使用生命周期回调方法

@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");
}

  }
Run Code Online (Sandbox Code Playgroud)

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

@Entity
@EntityListeners(EmployeeLoggingListener.class)
public class Employee{...}
Run Code Online (Sandbox Code Playgroud)

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() );
    }

 }
Run Code Online (Sandbox Code Playgroud)