2013-04-29 105 views
0

我想拦截JPA调用(不需要触及实体类),因此需要$ subject?有没有人试过类似的东西?有没有办法覆盖openjpa中的javax.persistence.EntityManager.persist()方法

+0

嗨克里斯和dcernahoschi 感谢您的线索,都是对我来说是非常有用的信息。我认为这正是我需要的。我完全按照dcernahoschi的说法。但听众没有受到打击。我可以调试openjpa EntityManager等。我怎么知道我的听众是否已注册。或者给定配置中缺少什么? – 2013-04-29 15:04:51

+1

请看看我在xml配置更新的答案。还添加了2个标签。 – dcernahoschi 2013-04-29 15:34:13

+0

同样的结果。我把每个方法的日志放在listener中。我认为我的听众可能没有注册。在这种情况下,我正在处理Apache JUDDI的持久层。所以我在jar里添加了一个新创建的orm.xml文件。 META-INF /其中persistence.xml也驻留。看来它不是在那个地方采摘。任何想法为什么? – 2013-04-29 15:52:26

回答

1

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

但您可以使用ORM.xml文件添加事件侦听器 - JPA允许添加适用于所有实体的默认侦听器,因此您无需触摸其中的任何一个。 JPA尚未提供什么内容?

+0

嗨克里斯, 其实我试过了,但是当我指定类的时候它并没有被拾起。我所做的就是,MyProvider扩展了openjpa.PersistenceProviderImpl。必须检查玻璃鱼/春天是如何做到的。 \ – 2013-04-29 17:32:08

+1

您需要将您的提供程序类注册到Persistence类才能使用它。它需要一个META-INF \ services \ javax.persistence.spi.PersistenceProvider文件来指定您的提供者类,以便它知道它是与持久性单元一起使用的JPA提供程序。通过听众是更好的方法。 – Chris 2013-04-29 18:02:05

+0

我已经将提供程序类名添加到persistence.xml和javax.persistence.spi.PersistenceProvider文件中。是的,通过听众是更好的方式,但出于某种原因,它没有被打。有没有办法检查我的听众是否在openjpa中注册? – 2013-04-30 01:47:20

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 
相关问题