我想拦截JPA调用(不触及实体类),因此需要$ subject?有没有人尝试过类似的东西。
答案 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