问题: entityManager.unwrap(SessionImplementor.class)导致no transactional entitymanager available异常。
entityManager.unwrap(SessionImplementor.class)
no transactional entitymanager available
码:
@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接口中的afterPropertiesSet一样),无法确保已完成所有后期处理,因此(实际上)不能有任何事务。
如我所见,您不需要事务也不需要实体管理器bean,而是需要实体管理器工厂bean。我认为您应该简单地自动连接EntityManagerFactory,然后从中解开HibernateSessionFactory。
@Autowired private EntityManagerFactory entityManagerFactory; @PostConstruct public void registerListeners() { SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); ... }