Hibernate JPA and Spring javax.persistence.TransactionRequiredException: no transaction is in progress

后端 未结 13 2687
说谎
说谎 2020-12-05 17:52

When I call:

entityManager.flush()

I get the exception mentioned in the title.

I am using Hibernate JPA.

13条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-05 18:25

    Spring 4.3.1 / Hibernate 4.2.21

    My configuration was 100% Java code with no hibernate or spring xml documents (eg context.xml, persistence.xml etc). The issue was the EntityManagerFactory I was passing to the TransactionManager, see the below configuration in the transactionManager method.

    @Configuration
    @EnableTransactionManagement
    public class HibernateConfiguration2 {
    
    @Bean
    public DataSource dataSource() {
        return ...; // Build a basic datasource
    }
    
    @Bean
    @Autowired
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setDataSource(dataSource);
        entityManagerFactory.setPackagesToScan("nz.co.mark");
        entityManagerFactory.setPersistenceProviderClass(org.hibernate.ejb.HibernatePersistence.class);
    
        return entityManagerFactory;
    }
    
    @Bean
    @Autowired
    public EntityManager entityManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
        EntityManager em = localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory().createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        return em;
    }
    
    @Bean
    @Autowired
    public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) throws Exception {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf.getObject());
        // The below line would generate javax.persistence.TransactionRequiredException: no transaction is in progress
        // transactionManager.setEntityManagerFactory(emf.getNativeEntityManagerFactory());
        return transactionManager;
    }
    

提交回复
热议问题