有没有办法覆盖openjpa中的javax.persistence.EntityManager.persist()方法

时间:2013-04-29 12:31:51

标签: java jpa openjpa

我想拦截JPA调用(不触​​及实体类),因此需要$ subject?有没有人尝试过类似的东西。

2 个答案:

答案 0 :(得分:1)

每个容器都会创建一个代理EM,因此您可以轻松查看spring或glassfish是如何做到的。在persistence.xml中,您指定要使用的提供程序类,因此只需将其指向您的实现即可。

但您可以使用ORM.xml文件添加事件侦听器 - JPA允许添加适用于所有实体的默认侦听器,因此您无需触及任何实体。在JPA尚未提供之后你到底是什么?

答案 1 :(得分:1)

您可以通过为orm.xml文件中的所有实体指定默认实体侦听器来拦截JPA生命周期事件,例如“onPersist”。无需触摸实体。例如:

class SomeListener { 
   @PrePersist
   private void prePersist(Object entity){
      //do some stuff before persisting the entity
   }

   @PostPersist
   private void postPersist(Object entity){
       //do some staff after persisting the entity
   }
}

<entity-mappings>
  <persistence-unit-metadata>
    <persistence-unit-defaults>
       <entity-listeners>
          <entity-listener class="SomeListener">
          <pre-persist method-name="prePersist"/>
          <post-persist method-name="postPersist"/>
        </entity-listener>
       </entity-listeners>
     </persistence-unit-defaults>
  </persistence-unit-metadata>
</entity-mappings