Java @PostConstruct中没有可用的事务性entitymanager
问题:Java @PostConstruct中没有可用的事务性entitymanager,java,spring,hibernate,Java,Spring,Hibernate,问题: entityManager.unwrap(SessionImplementor.class)原因没有可用的事务性entityManager异常 代码: @Component public class HibernateEventWiring { @Autowired private ViewListener listener; @PersistenceContext(unitName = "config-punit") private EntityMa
entityManager.unwrap(SessionImplementor.class)
原因没有可用的事务性entityManager
异常
代码:
@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();
}
}
根据:
在@PostConstruct中(与来自InitializingBean接口的AfterPropertieSet一样),无法确保所有的后处理都已经完成,因此(实际上)不可能有任何事务
如我所见,您不需要事务或实体管理器bean,而是需要实体管理器工厂bean。我认为您应该简单地自动连接EntityManagerFactory,然后从中打开Hibernate SessionFactory
@Autowired
private EntityManagerFactory entityManagerFactory;
@PostConstruct
public void registerListeners() {
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
...
}
根据:
在@PostConstruct中(与来自InitializingBean接口的AfterPropertieSet一样),无法确保所有的后处理都已经完成,因此(实际上)不可能有任何事务
如我所见,您不需要事务或实体管理器bean,而是需要实体管理器工厂bean。我认为您应该简单地自动连接EntityManagerFactory,然后从中打开Hibernate SessionFactory
@Autowired
private EntityManagerFactory entityManagerFactory;
@PostConstruct
public void registerListeners() {
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
...
}
此外,您不应该无意中导入了
javax.transaction.Transactional
(Java EE 7)而不是org.springframework.transaction.annotation.Transactional
。我假设您使用的是org.springframework.transaction.annotation.Transactional而不是javax.transaction.Transactional annotation。这是真的吗?此外,您不应该无意中导入了javax.transaction.Transactional
(Java EE 7)而不是org.springframework.transaction.annotation.Transactional
。我假设您使用的是org.springframework.transaction.annotation.Transactional,而不是javax.transaction.Transactional annotation。这是真的吗?EntityManagerFactory
没有unwrap
方法。将您的答案更新为((HibernateEntityManagerFactory)entityManagerFactory)。getSessionFactory()
请参阅JPA的2.1版。entityManagerFactory类上有unwrap方法。()最后,我使用了与您的答案略有不同的entityManager.getEntityManagerFactory().unwrap(SessionFactory.class)
(受此启发),因为entityManager
在Spring之前已经注入到类中。EntityManagerFactory
没有unwrap
方法。将您的答案更新为((HibernateEntityManagerFactory)entityManagerFactory)。getSessionFactory()
请参阅JPA的2.1版。entityManagerFactory类上有unwrap方法。()最后,我使用了与您的答案略有不同的entityManager.getEntityManagerFactory().unwrap(SessionFactory.class)
(受此启发),因为entityManager
已在Spring之前注入到类中。