localcontainerentitymanagerfactorybean example entitymanagerfactory java spring hibernate jpa

java - example - spring jpa hibernate



HibernateTransactionManager o JpaTransactionManager (1)

Él quiere que su código dependa de JPA, en lugar de Hibernate. 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.

Desarrollando una aplicación con un amigo, pero encontré una pregunta ... Tenía este código:

<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 lo eliminó todo, lo 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 cambió así:

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); }