Подтвердить что ты не робот

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 напрямую, означает ли это, что мы больше не используем спящий режим? Это действительно лучше подходит?

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

Ответ 1

Он хочет, чтобы ваш код зависел от JPA, а не от Hibernate. javax.persistence.EntityManager является стандартным интерфейсом JPA (Java EE), а org.hibernate.SessionFactory является целевым интерфейсом Hibernate. Переход от SessionFactory к EntityManager делает ваши классы больше не зависимыми от Hibernate. Использование JPA-пути вместо Hibernate-пути считается лучшей практикой для большинства людей сегодня.

Обратите внимание, что ваша система по-прежнему зависит от Hibernate, так как вам нужен поставщик JPA. Но если вы хотите в будущем перейти на другого поставщика JPA, это должно быть довольно прямолинейным. Еще одно преимущество для JPA заключается в том, что JPA-интерфейсы более стабильны, чем Hibernate.