Spring JPA / Hibernate EmptyInterceptor没有注入Entitymanager / Spring bean

专家/大师/友

我们正在使用Spring 3.2,JPA 2,Hibernate 4.2组合并面对这个奇怪的空指针问题,同时尝试将任何spring注释bean注入EmtyInterceptor,如下所示。 我们已经尝试过注释这个bean以及一个spring bean但没有运气。

任何帮助解决这个难题的人都非常感谢。

import javax.inject.Inject; import javax.inject.Named; import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type; import org.springframework.transaction.annotation.Transactional; ... @Named @Transactional public class AuditEmptyInterceptor extends EmptyInterceptor { /** * */ private static final long serialVersionUID = 1L; // Didnt inject - Null @PersistenceContext private EntityManager entityManager; // Didnt inject - Null //@PersistenceUnit //private EntityManagerFactory entityManagerFactory; // Didnt inject - Null //@Inject //private AuditHelper auditHelper; @Override public boolean onSave(Object entity, Serializable id, Object[] currentState, String[] propertyNames, Type[] types) { System.out.println("**********inside OnSave() in Audit Empty Interceptor******************"); if(entity instanceof xxAuditInterface || entity instanceof xxxCompBranchInterface){ for (int i = 0; i < propertyNames.length; i++) { ... ... // Null entityManager - NPE here javax.persistence.Query query = entityManager.createQuery("Select c From CompanyDO c Where c.companyName =:companyName"); query.setParameter("companyName", xxx); CompanyMasterDO companyMasterDO = (CompanyMasterDO) query.getSingleResult(); ... ... } } } } 

在应用程序的其他任何地方,注入都像魅力一样没有任何问题。 这是我们的applicationContext.xml

                     

我们的spring-persistence.xml如下所示。 请注意,我在这里添加了Emptyinceptor属性。

    com.xxx ... ...      

让我知道您对此的宝贵意见/提示。 再次感谢您抽出时间阅读这篇文章。

我也读过在Hibernate的EmptyInterceptor中注入JPA的实体管理器的post。 但看起来他们是手动尝试找到名称要解决的bean,我觉得可能还有其他方式。

AuditEmptyInterceptor不是由Spring管理的bean,它由Hibernate实例化,因此您无法将依赖项注入其中。

您可以使用静态委托:

 public class StaticDelegateInterceptor extends EmptyInterceptor { private static Interceptor interceptor; public static void setInterceptor(Interceptor interceptor) { StaticDelegate.interceptor = interceptor; } public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { return StaticDelegate.interceptor.onSave(entity, id, state, propertyNames, types); } ... } 

在persistence.xml上注册StaticDelegateInterceptor

   com.xxx ... ...      

修改您当前的AuditEmptyInterceptor,以便它使用StaticDelegateInterceptor注册自己:

 @Named @Transactional public class AuditEmptyInterceptor extends EmptyInterceptor { @PostConstruct public void init() { StaticDelagateInterceptor.setInterceptor(this); } ... } 

最后通过设置depends-on属性来确保您的entityManagerFactory bean依赖于auditEmptyInterceptor

  ...