【发布时间】:2017-01-05 15:30:42
【问题描述】:
我有一个班级客户。我希望能够审计这个类的属性的变化(不是整个类 - 只是它的属性)。
public class Client {
private Long id;
private String firstName;
private String lastName;
private String email;
private String mobileNumber;
private Branch companyBranch;
其实这很容易用@Audited注解审计整个实体。
但我想要的是使用我的类结构来审核这些更改。
这是我想要的结果类:
public class Action {
private String fieldName;
private String oldValue;
private String newValue;
private String action;
private Long modifiedBy;
private Date changeDate;
private Long clientID;
结果应该是这样的:
fieldName + "从" + oldValue + "to" + newValue + "for" clientID +"by" modifiedBy;
- George 将比尔·盖茨的 mobileNumber 从 555 更改为 999。
我这样做的原因是我需要将此更改存储到操作表下的数据库中 - 因为我将审核来自不同实体的属性,并且我想将它们存储在一起,然后能够在我获取它们时需要。
我该怎么做?
谢谢
【问题讨论】:
-
JPA 不提供审计对特定属性的更改的方法。如果您使用 Hibernate 作为 JPA 提供程序,您可以编写自己的 Interceptor,实现
onFlushDirty方法,检查字段以查找更改的字段,然后生成审核日志。 -
你能给我举个拦截器使用的例子吗?我使用 Hibernate 作为 JPA 提供程序
-
我开始考虑Custom Annotations is Spring。但是无法弄清楚如何正确获取旧实例和新实例。例如,我创建注释 @CaptureChange,它将以我的确切方式开始捕获 change 的过程。这对我的解决方案来说真的是个好主意吗?
-
@JONIVar 从我下面的答案中可以看出,自定义注释可以使用 AOP(Spring AOP 或 AspecJ 编译时)进行处理。这种方法比 Hibernate 拦截器稍微复杂一些,但它是更灵活的解决方案,没有性能开销。
标签: java spring jpa audit-logging