我想定义一个@Entity
,其更改(CRUD操作)应记录到文本文件中。
是否有任何框架可以与spring
一起使用?
我知道Envers
,但这会增加数据库表中的历史条目。但我只想记录日志,没有版本跟踪。
我主要使用spring CrudRepository
接口进行CRUD操作。
答案 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)
答案 2 :(得分:0)
您应该查看Hibernate interceptors
,当您必须对与持久性相关的事件作出反应时,它是有用的,提供的回调是
- onSave - 保存对象时调用,该对象不保存 数据库呢。
- onFlushDirty - 更新对象时调用, 对象尚未更新到数据库中。
- onDelete - 删除对象时调用,该对象尚未删除到数据库中。
- preFlush - 在保存,更新或删除的对象被提交到数据库之前调用(通常在postFlush之前)。
- postFlush - 之后调用 保存,更新或删除的对象将提交到数据库。
here你可以找到一个基于Hibernate拦截器的exemplery审计日志实现