【问题标题】:How could I do an interceptor for EntityManager.class我怎么能为 EntityManager.class 做一个拦截器
【发布时间】:2012-03-06 20:34:07
【问题描述】:

我想使用 entitymanager 审核插入、更新、删除等。为此,我怎样才能为 EntityManager.class 做一个拦截器来与 EJB 一起工作???

【问题讨论】:

    标签: java jpa ejb entitymanager


    【解决方案1】:

    您不需要为此添加拦截器,只需使用 JPA 的 callback methods 和/或 entity listeners

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

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

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

    【讨论】:

    • 我知道,但是例如,如果我需要审核@PreUpdate,当执行此回调方法时,JPA 似乎已经附加了我的实体更新。事实上,要审计我需要我的实体的最后一个值。
    • A @PreUpdate 保证在数据库更新之前 的某个时间点被调用。为了存储以前的值,在@PostLoad 中将当前值保存在同一实体的另一个属性中;当@PreUpdate 执行时,“旧”值将存在,而“新”值将在此时实体的常规属性中。
    • 但是在@PreUpdate 方法上,我怎么能得到旧值?
    • 正如我上面所说:在@PostLoad 中,您将当前值保存在一组不同的属性中。当您到达@PreUpdate 时,这些属性将保存“旧”值,而“新”值将在普通属性上找到。
    • 您可以在orm.xml 文件的persistence-unit-defaults 中添加一个entity-listener 元素(参见here)。除此之外,除了编写自己的 EntityManager 之外,不,你不能拥有 EntityManager 类的拦截器。
    猜你喜欢
    • 2010-09-09
    • 2011-06-03
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多