Java 如何为EntityManager.class执行拦截器
我想使用entitymanager审核插入、更新、删除等。为此,我如何为EntityManager.class创建一个拦截器,该拦截器将与EJB一起工作?您不需要为此添加拦截器,只需使用JPA和/或 使用第一种方法,可以向实体中添加使用以下注释之一声明的方法:Java 如何为EntityManager.class执行拦截器,java,jpa,ejb,entitymanager,Java,Jpa,Ejb,Entitymanager,我想使用entitymanager审核插入、更新、删除等。为此,我如何为EntityManager.class创建一个拦截器,该拦截器将与EJB一起工作?您不需要为此添加拦截器,只需使用JPA和/或 使用第一种方法,可以向实体中添加使用以下注释之一声明的方法:@PrePersist、@postersist、@PreUpdate、@PostUpdate、@PreRemove、@postmove或@PostLoad。这些名称是自解释的,这意味着对于每个事件(pre-persist、post-pers
@PrePersist
、@postersist
、@PreUpdate
、@PostUpdate
、@PreRemove
、@postmove
或@PostLoad
。这些名称是自解释的,这意味着对于每个事件(pre-persist、post-persist等),都会调用带注释的方法
第二种方法类似,但这些方法是在一个或多个单独的类中实现的,然后使用@EntityListeners
注释将这些类添加到实体中
第二种方法更灵活,但无论哪种方法,您都可以在持久性操作发生之前/之后截获它们,并执行您需要的操作。我知道,但例如,如果我需要审核@PreUpdate,当执行此回调方法时,JPA似乎已经附加了我的实体更新。事实上,要进行审计,我需要实体的最后一个值。
@PreUpdate
保证在数据库更新之前的某个时间点被调用。为了存储以前的值,在@PostLoad
中,将当前值保存在同一实体的另一个属性中;当执行@PreUpdate
时,“旧”值将在那里,“新”值将在该点的实体的常规属性中。但是在@PreUpdate方法中,我如何获得旧值?正如我上面所说:在@PostLoad
中,您将当前值保存在不同的属性集中。当您到达@PreUpdate
时,这些属性将保存“旧”值,而“新”值将在普通属性上找到。您可以在orm.xml
文件的持久化单元默认值中添加实体侦听器
元素(请参阅)。除此之外,除了编写自己的EntityManager
,不,您不能为EntityManager
类设置拦截器。