2012-09-09 33 views
33

開發與應用的朋友,但遇到了一個問題... 我有這樣的代碼:爲HibernateTransactionManager或JpaTransactionManager接口

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
    </property> 
</bean> 

<tx:annotation-driven /> 
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

他刪除了這一切,把它改爲:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager"/> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="persistenceUnit"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

他說,這是更好的方法,但沒有完全解釋爲什麼。關於不直接使用hibernate的事情,這是否意味着我們不再使用hibernate了?這真的是更好的方法嗎?

DAO改變這樣的:

我:

@Autowired 
private SessionFactory sessionFactory; 

public void addUser(User user) { 
    sessionFactory.getCurrentSession().save(user); 
} 

現在是:

@PersistenceContext 
private EntityManager entityManager; 

public void addUser(User user) { 
    entityManager.persist(user); 
} 
+0

我也有這個額外的問題: 如果我使用JPA方式配置,是否有任何區別,如果我使用Hibernate 3.X依賴或休眠4.X? – grep

回答

43

他想你的代碼依賴於JPA,而不是休眠。 javax.persistence.EntityManager是一個JPA(Java EE)標準接口,而org.hibernate.SessionFactory是一個Hibernate有屬性接口。從SessionFactory移動到EntityManager使您的類不再依賴於Hibernate。今天大多數人認爲使用JPA方式而不是Hibernate方式是最佳做法。

請注意,您的系統仍然依賴於Hibernate,因爲您需要JPA提供程序。但是如果你想在未來轉換到另一個JPA提供者,它應該是非常簡單的。去JPA的另一個好處是JPA接口比Hibernate接口更穩定。

+0

因此,我可以刪除我的hibernate庫?哪種更好的做法,我的解決方案還是他的?我不能使用'hibernate.hbm2ddl.auto',用他的解決方案嗎? – Jaanus

+1

@Jaanus我已經更新了關於最佳實踐的答案,以及是否可以刪除hibernate庫(你不能)。您仍然可以使用hibernate.hbm2ddl.auto:在entityManagerFactory的:<屬性名= 「jpaProperties」>如果我使用JPA <支撐鍵= 「hibernate.hbm2ddl.auto」> $ {} hibernate.hbm2ddl.auto

+0

如果我有休眠3.X依賴或休眠4.X有什麼區別嗎? – grep

相關問題