如何在创建SessionFactory后分配拦截器?

时间:2014-09-06 00:51:45

标签: java hibernate jpa

我们有一个使用JPA的Hibernate实现的代码库,但迄今为止只使用了JPA的基本功能。特别是这意味着我们使用了EntityManager而不是SessionBuilder。采用这种方法是因为(直到现在)我们只需要基础JPA工具,并且看不到使用Hibernate构造的好处。但是,我们现在需要Hibernate Interceptor可以提供的功能,并且正在寻找实现它的方法。

我们看到如何从现有的EntityManager获取Session和SessionFactory,但是看不到如何将Interceptor“添加”到现有的Session(Builder)。我们可以找到许多示例来说明如何配置SessionFactory,以便在构建SessionFactory时它将以Interceptor启动,但是如果(通过创建EntiryManager)SessionFactor已经存在,如何添加Interceptor?

谢谢。

09/09/14编辑: 根据AVolpe提供的链接(http://nsinfra.blogspot.com/2013/10/audit-logging-using-hibernate.html),我了解了persistence.xml!我添加但是在部署到JBoss 7后,我得到: [PersistenceUnit:PU]无法找到拦截器类:com.MyCom.model.HibernateInterceptor。

这是HibernateInterceptor:

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class HibernateInterceptor extends EmptyInterceptor {
HibernateInterceptor() {}
... the required overrides ...
}

知道为什么没有找到类HibernateInterceptor吗?

09/11/14编辑: 不,这里没有春天。

我已经改变了我的方法,认为有一些进展,但现在有一个错误。以下是详细信息:

在Session开始后“注册”一个拦截器我现在这样做:

@PersistenceContext(unitName=UtilitiesModel.JPA_PERSISTENCE_UNIT)   
private EntityManager em;   
...    
SessionFactory sessionFactory = entityManager.unwrap(org.hibernate.Session.class).getSessionFactory();  
Session session = sessionFactory.withOptions().interceptor(new MyInterceptor()).openSession();  

这在编译或部署时不会产生任何错误。

据我了解,我还需要在persistence.xml中“注册”拦截器,以下是如何完成的:

<property name="hibernate.ejb.interceptor." value="com.MyCom.model.HibernateInterceptor." />

最后,这是HibernateInterceptor:

public class HibernateInterceptor extends EmptyInterceptor {
HibernateInterceptor() {}

@Override
public void onDelete(...

...
}

不幸的是,当我(从Eclipse - Kepler出来)部署到JBoss 7时出现以下错误:

javax.persistence.PersistenceException: [PersistenceUnit: PU] Unable to find hibernate.ejb.interceptor: com.MyCom.model.HibernateInterceptor.

我是否需要以某种方式注释HibernateInterceptor?你能看出这里有什么问题吗?

0 个答案:

没有答案