2012-09-09 9 views
33

desarrollo de aplicaciones con un amigo, pero se encontró con una pregunta ... tuve este código:HibernateTransactionManager o 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> 

y quitó todo, cambié a:

<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> 

Dijo que este es un mejor enfoque, pero no explicó exactamente por qué. Algo acerca de no usar Hibernate directamente, ¿significa esto que ya no usaremos Hibernate? ¿Es realmente mejor enfoque?

DAO cambiado la siguiente manera:

tuve:

@Autowired 
private SessionFactory sessionFactory; 

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

Ahora es:

@PersistenceContext 
private EntityManager entityManager; 

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

También tengo esta pregunta adicional: Si uso la configuración de modo JPA, ¿hay alguna diferencia si uso la dependencia de hibernación 3.X o la hibernación 4.X? – grep

Respuesta

43

Él quiere que su código sea dependiente de la APP, en lugar de hibernación. javax.persistence.EntityManager es una interfaz estándar JPA (Java EE), mientras que org.hibernate.SessionFactory es una interfaz propietaria de Hibernate. Pasar de SessionFactory a EntityManager hace que sus clases ya no dependan de Hibernate. La mayoría de las personas considera que usar JPA-way en lugar de Hibernate-way es la mejor práctica.

Tenga en cuenta que su sistema aún depende de Hibernate, ya que necesita un proveedor de JPA. Pero si quiere cambiar a otro proveedor de JPA en el futuro, debería ser bastante directo. Otra ventaja de ir por JPA es que las interfaces JPA son más estables que las de Hibernate.

+0

Entonces, ¿puedo eliminar mis bibliotecas de hibernación? ¿Cuál es la mejor práctica, mi solución o la suya? No puedo usar 'hibernate.hbm2ddl.auto', con su solución? – Jaanus

+1

@Jaanus He actualizado la respuesta sobre las mejores prácticas y si puede eliminar las bibliotecas de hibernación (no puede). Puede seguir utilizando hibernate.hbm2ddl.auto: En EntityManagerFactory: $ {} hibernate.hbm2ddl.auto

+0

Si uso JPA modo de configuración, ¿hay alguna diferencia si tengo hibernación 3.X dependencia o hibernación 4.X? – grep