繁体   English   中英

@PostConstruct中没有可用的交易实体管理器

[英]No transactional entitymanager available in @PostConstruct

问题: entityManager.unwrap(SessionImplementor.class) no transactional entitymanager available导致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,然后从中解开Hibernate SessionFactory。

@Autowired
private EntityManagerFactory entityManagerFactory;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM