我遇到了使用Spring 4.3,JPA 2.1和Hibernate 5將對象持久化到數據庫的問題。 找出事務出錯的地方。 這裏是我的配置:@Transactional爲什麼沒有使用@Autowired EntityManagerFactory?
@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'這一說法,這不是事務性實體管理器,因此沒有對'EntityManager'提交用來調用'persist'上。通過自動佈線'EntityManager',您將獲得事務性的'EntityManager'。 –
@ M.Deinum:您能否將您的評論添加爲答案,以便我能夠接受它? – nmeln