【问题标题】:Audit accesses to a JPA entity审计对 JPA 实体的访问
【发布时间】:2017-01-13 06:39:04
【问题描述】:
我有一个 JPA 实体,有它的属性和几个NamedQueries。
我正在尝试记录一些信息“任何时候实体用于某事”,即:
- 任何时候调用它的任何 NamedQueries
- 任何时候在查询中使用实体 q = em.createQuery("SELECT....FROM thisEntity a, otherEntity b WHERE.....");
- 任何时候访问它的任何属性
我要记录的信息必须包括调用者类名和调用者方法等。
我想这必须通过拦截器来实现,但我不确定拦截器是否允许我拦截对抛出其NamedQueries的类的访问。
【问题讨论】:
标签:
jpa
interceptor
audit
【解决方案1】:
您可以使用实体类中的@PrePersist、@PostPersist、@PostLoad、@PreUpdate、@PostUpdate、@PreRemove、@PostRemove 等回调方法来实现这一点。
例如
public class EntityA {
...
@PrePersist
public void beforePersist(){
//Log information
}
}
此外,您可以在侦听器类中使用该回调方法。
public class EntityListenerA{
@PrePersist
public void beforePersist(EntityA ob) {
//Log information
}
}
@EntityListeners(EntityListenerA.class)
public class EntityA {
...
}
在您的情况下,我假设您必须根据查询使用回调 @PostLoad。
希望有帮助