2015-11-25 68 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; 
相關問題