Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为EntityManager.class执行拦截器_Java_Jpa_Ejb_Entitymanager - Fatal编程技术网

Java 如何为EntityManager.class执行拦截器

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

我想使用entitymanager审核插入、更新、删除等。为此,我如何为EntityManager.class创建一个拦截器,该拦截器将与EJB一起工作?

您不需要为此添加拦截器,只需使用JPA和/或

使用第一种方法,可以向实体中添加使用以下注释之一声明的方法:
@PrePersist
@postersist
@PreUpdate
@PostUpdate
@PreRemove
@postmove
@PostLoad
。这些名称是自解释的,这意味着对于每个事件(pre-persist、post-persist等),都会调用带注释的方法

第二种方法类似,但这些方法是在一个或多个单独的类中实现的,然后使用
@EntityListeners
注释将这些类添加到实体中


第二种方法更灵活,但无论哪种方法,您都可以在持久性操作发生之前/之后截获它们,并执行您需要的操作。

我知道,但例如,如果我需要审核@PreUpdate,当执行此回调方法时,JPA似乎已经附加了我的实体更新。事实上,要进行审计,我需要实体的最后一个值。
@PreUpdate
保证在数据库更新之前的某个时间点被调用。为了存储以前的值,在
@PostLoad
中,将当前值保存在同一实体的另一个属性中;当执行
@PreUpdate
时,“旧”值将在那里,“新”值将在该点的实体的常规属性中。但是在@PreUpdate方法中,我如何获得旧值?正如我上面所说:在
@PostLoad
中,您将当前值保存在不同的属性集中。当您到达
@PreUpdate
时,这些属性将保存“旧”值,而“新”值将在普通属性上找到。您可以在
orm.xml
文件的
持久化单元默认值中添加
实体侦听器
元素(请参阅)。除此之外,除了编写自己的
EntityManager
,不,您不能为
EntityManager
类设置拦截器。