我们有一个使用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?你能看出这里有什么问题吗?