【发布时间】:2012-03-06 20:34:07
【问题描述】:
我想使用 entitymanager 审核插入、更新、删除等。为此,我怎样才能为 EntityManager.class 做一个拦截器来与 EJB 一起工作???
【问题讨论】:
标签: java jpa ejb entitymanager
我想使用 entitymanager 审核插入、更新、删除等。为此,我怎样才能为 EntityManager.class 做一个拦截器来与 EJB 一起工作???
【问题讨论】:
标签: java jpa ejb entitymanager
您不需要为此添加拦截器,只需使用 JPA 的 callback methods 和/或 entity listeners。
使用第一种方法,您可以向使用以下注释之一声明的实体方法添加:@PrePersist、@PostPersist、@PreUpdate、@PostUpdate、@PreRemove、@PostRemove 或 @PostLoad。这些名称是不言自明的,这意味着对于每个事件(pre-persist、post-persist 等),都会调用带注释的方法。
第二种方法类似,但方法在一个或多个单独的类中实现,然后使用@EntityListeners 注解将其添加到实体中。
第二种方法更灵活,但无论哪种方式,您都可以在持久性操作发生之前/之后拦截它们并执行您需要的操作。
【讨论】:
@PreUpdate 保证在数据库更新之前 的某个时间点被调用。为了存储以前的值,在@PostLoad 中将当前值保存在同一实体的另一个属性中;当@PreUpdate 执行时,“旧”值将存在,而“新”值将在此时实体的常规属性中。
@PostLoad 中,您将当前值保存在一组不同的属性中。当您到达@PreUpdate 时,这些属性将保存“旧”值,而“新”值将在普通属性上找到。
orm.xml 文件的persistence-unit-defaults 中添加一个entity-listener 元素(参见here)。除此之外,除了编写自己的 EntityManager 之外,不,你不能拥有 EntityManager 类的拦截器。