我有一个 Web 服务,它将持久化和删除数据库中的数据。我想在数据库中跟踪哪些用户名触及了数据库的哪些行。在每个表中都有用于存储用户名的列(如果您愿意,请更新列)。表上还有触发器,它们将获取事务的用户 ID,并使用尝试插入的用户名和密码更新该表。有没有办法在开放的 JPA 中获取用户名(将从客户端传递)并更新某种 JPA 对象,以便当 JPA 持久化数据时,该用户名将被扔到表中?
问问题
459 次
1 回答
1
最简洁的方法之一是为您的实体实现一个通用的“映射”超类,并使用带有@PrePersist
注释的方法来填充字段。
@MappedSuperclass
public class AuditedEntity {
@Id protected Integer id;
protected String lastUpdatedBy;
// Setters and getters here
@PreUpdate
@PrePersist
public void onChange() {
String user = .... // Do whatever is needed to get the current user
setLastUpdatedBy(user);
}
}
@Entity
public class Employee extends AuditedEntity {
// ....
}
另一种选择是使用单独的侦听器:
public interface AuditedEntity {
public static void setLastUpdatedBy(String username);
}
@Entity
@EntityListeners({ MyLogger.class, ... })
public class Employee implements AuditedEntity {
// ...
}
public class MyLogger {
@PreUpdate
@PrePersist
public void onChange(Object o) {
if(o instanceof AuditedEntity) {
String user = .... // Do whatever is needed to get the current user
((AuditedEntity) o).setLastUpdatedBy(user);
}
}
@PostPersist
@PostUpdate
public void logChange(Object o) {
// Log the successful operation
}
}
于 2012-08-27T19:54:10.653 回答