使用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
?
答案 0 :(得分:2)
您正在使用Spring进行事务管理,因此您希望获得当前的事务EntityManager
。如果您正在注入EntityManagerFactory
并使用它来获得EntityManager
,那么您有一个很好的更改,最终会得到一个新的更改,这个新的未绑定到已启动的事务。
使用EntityManager
@PersistenceContext
@PersistenceContext
private EntityManager em.
如果您真的要注入EntityMangerFactory
,则必须使用@PersistenceUnit
而不是@Autowired
。 @PersistenceUnit
的处理方式与普通@Autowired
不同。
@PersistenceUnit
private EntityManagerFactory emf;