2015-11-25 71 views
1

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

+2

因为你正在创建一个新的'EntityManager'这一说法,这不是事务性实体管理器,因此没有对'EntityManager'提交用来调用'persist'上。通过自动布线'EntityManager',您将获得事务性的'EntityManager'。 –

+0

@ M.Deinum:您能否将您的评论添加为答案,以便我能够接受它? – nmeln

回答

1

您正在使用Spring进行交易管理,因此您希望获得当前交易EntityManager。如果您正在注入EntityManagerFactory并使用它来获得EntityManager,那么您将得到一个很好的更改,最终得到一个新的新的,这个新的没有绑定到已启动的事务。

而是注入EntityManager使用@PersistenceContext

@PersistenceContext 
private EntityManager em. 

如果你真的想注入EntityMangerFactory你必须使用@PersistenceUnit而不是@Autowired@PersistenceUnit的处理方式与普通的@Autowired不同。

@PersistenceUnit 
private EntityManagerFactory emf; 
相关问题