为什么@Transactional 不能与@Autowired EntityManagerFactory 一起工作?
Why didn't @Transactional work with @Autowired EntityManagerFactory?
我在使用 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
?
您正在使用 Spring 进行事务管理,因此您想要获取当前事务 EntityManager
。如果您正在注入 EntityManagerFactory
并使用它来获得 EntityManager
,那么您有一个很好的更改,您最终会得到一个新的,这个新的不绑定到开始的事务。
而是使用 @PersistenceContext
注入 EntityManager
@PersistenceContext
private EntityManager em.
如果你真的想注入 EntityMangerFactory
,你必须使用 @PersistenceUnit
而不是 @Autowired
。 @PersistenceUnit
的处理方式不同于普通的 @Autowired
。
@PersistenceUnit
private EntityManagerFactory emf;
我在使用 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
?
您正在使用 Spring 进行事务管理,因此您想要获取当前事务 EntityManager
。如果您正在注入 EntityManagerFactory
并使用它来获得 EntityManager
,那么您有一个很好的更改,您最终会得到一个新的,这个新的不绑定到开始的事务。
而是使用 @PersistenceContext
EntityManager
@PersistenceContext
private EntityManager em.
如果你真的想注入 EntityMangerFactory
,你必须使用 @PersistenceUnit
而不是 @Autowired
。 @PersistenceUnit
的处理方式不同于普通的 @Autowired
。
@PersistenceUnit
private EntityManagerFactory emf;