为什么@Transactional不能与@Autowired EntityManagerFactory一起使用?

时间:2015-11-25 20:16:24

标签: java spring hibernate jpa entitymanager

使用Spring 4.3,JPA 2.1和Hibernate 5将对象持久保存到数据库时出现问题。 弄清楚交易出了什么问题。 这是我的配置:

@Configuration
@EnableTransactionManagement
public class PersistenceConfig {

   /**
     * most bean methods skipped, left only the relevant ones
    **/


    @Bean
    @Autowired
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
        entityManagerFactoryBean.setPackagesToScan("com.company");
        entityManagerFactoryBean.setJpaProperties(jpaProperties());
        return entityManagerFactoryBean;
    }

    @Bean
    @Autowired
    JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }

这是我的服务。代码已运行,没有抛出任何异常。但是该对象并未持久存储到数据库中。我直观地理解了事务创建出错(因为记录器没有显示任何事务)或者数据没有提交给数据库。 EntityManagerFactory 不为空

@Service
public class Manager {

@Autowired
private EntityManagerFactory entityManagerFactory;

@Transactional
public void persist(Entity entity){
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.persist(entity);
}

}

我用@Autowired EntityManagerFactory替换@javax.persistence.PersistenceContext EntityManager后,一切正常。

@Service
public class Manager {

@javax.persistence.PersistenceContext
private EntityManager entityManager;


@Transactional
public void persist(Entity entity){
    entityManager.persist(entity);
}

}

为什么它不适用于@Autowired EntityManagerFactory

1 个答案:

答案 0 :(得分:2)

您正在使用Spring进行事务管理,因此您希望获得当前的事务EntityManager。如果您正在注入EntityManagerFactory并使用它来获得EntityManager,那么您有一个很好的更改,最终会得到一个新的更改,这个新的未绑定到已启动的事务。

使用EntityManager

注入@PersistenceContext
@PersistenceContext
private EntityManager em.

如果您真的要注入EntityMangerFactory,则必须使用@PersistenceUnit而不是@Autowired@PersistenceUnit的处理方式与普通@Autowired不同。

@PersistenceUnit
private EntityManagerFactory emf;