【发布时间】:2016-02-28 18:49:46
【问题描述】:
我在使用 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?
【问题讨论】:
-
因为您正在使用它创建一个新的
EntityManager,它不是事务实体管理器,因此在用于调用persist的EntityManager上没有提交。通过自动连接EntityManager,您将获得事务性EntityManager。 -
@M.Deinum:您能否添加您的评论作为答案,以便我接受?
标签: java spring hibernate jpa entitymanager