2014-12-19 86 views
0

问题: entityManager.unwrap(SessionImplementor.class)原因no transactional entitymanager available异常。@PostConstruct中没有交易型实体管理器可用

代码:

@Component 
public class HibernateEventWiring { 

    @Autowired 
    private ViewListener listener; 

    @PersistenceContext(unitName = "config-punit") 
    private EntityManager entityManager; 

    @PostConstruct 
    public void registerListeners() { 
     SessionFactory sessionFactory = getSessionFactory(); 
     EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService(
       EventListenerRegistry.class); 
     registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener(listener); 
    } 

    @Transactional 
    private SessionFactory getSessionFactory() { 
     // EXCEPTION: No transactional entitymanager available 
     return entityManager.unwrap(SessionImplementor.class).getFactory(); 
    } 
} 
+1

http://stackoverflow.com/q/14522691/1391249,http://stackoverflow.com/q/3423972/1391249此外,你不应该无意中进口'javax.transaction.Transactional'(Java的EE 7)代替'org.springframework.transaction.annotation.Transactional'。 – Tiny

+0

我假设您使用org.springframework.transaction.annotation.Transactional而不是javax.transaction.Transactional注释。真的吗? –

回答

3

根据this excelent answer

在@PostConstruct(与afterPropertiesSet方法从InitializingBean接口仅)是没有办法,以确保所有的后处理已经完成了,所以(的确)没有交易。

正如我所看到的,您不需要事务或实体管理器bean,而是实体管理器工厂bean。我认为你应该简单地自动调用EntityManagerFactory,然后从中解开Hibernate SessionFactory。

@Autowired 
private EntityManagerFactory entityManagerFactory; 

@PostConstruct 
public void registerListeners() { 
    SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); 
    ... 
} 
+0

'EntityManagerFactory'没有'unwrap'方法。更新你的答案((HibernateEntityManagerFactory)entityManagerFactory).getSessionFactory()'请 –

+0

从JPA 2.1版本开始,在EntityManagerFactory类上有unwrap方法。 ([javaee 7 javadoc](http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManagerFactory.html#unwrap(java.lang.Class))) –

+0

我结束了使用你的一个小的变化因为'entityManager'已经存在,所以使用'entityManager.getEntityManagerFactory()。unwrap(SessionFactory.class)'(它受到了这个[答案](http://stackoverflow.com/a/17981359/177696)的启发)春季注入课堂。 – Saheed