Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @PostConstruct中没有可用的事务性entitymanager_Java_Spring_Hibernate - Fatal编程技术网

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之前注入到类中。