我遇到了使用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