【问题标题】:HibernateTransactionManager or JpaTransactionManagerHibernateTransactionManager 或 JpaTransactionManager
【发布时间】:2012-09-02 11:34:38
【问题描述】:

正在和朋友一起开发应用程序,但遇到了一个问题... 我有这个代码:

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

他说,这是更好的方法,但没有准确解释原因。关于不直接使用休眠的东西,这是否意味着我们根本不再使用休眠?真的是更好的方法吗?

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

【问题讨论】:

  • 我还有这个额外的问题:如果我使用JPA方式配置,我使用hibernate 3.X依赖还是hibernate 4.X有什么区别吗?

标签: java spring hibernate jpa


【解决方案1】:

他希望您的代码依赖于 JPA,而不是 Hibernate。 javax.persistence.EntityManager 是 JPA (Java EE) 标准接口,而 org.hibernate.SessionFactory 是 Hibernate 属性接口。从 SessionFactory 迁移到 EntityManager 使您的类不再依赖于 Hibernate。使用 JPA 方式而不是 Hibernate 方式被当今大多数人认为是最佳实践。

请注意,您的系统仍然依赖于 Hibernate,因为您需要 JPA 提供程序。但是,如果您将来想更改为另一个 JPA 提供程序,那应该非常简单。使用 JPA 的另一个优势是 JPA 接口比 Hibernate 接口更稳定。

【讨论】:

  • 所以我可以删除我的休眠库吗?哪个是更好的做法,我的解决方案还是他的?我不能用hibernate.hbm2ddl.auto,用他的解决方案?
  • @Jaanus 我已经更新了关于最佳实践以及是否可以删除休眠库(你不能)的答案。您仍然可以使用 hibernate.hbm2ddl.auto:在 entityManagerFactory:${hibernate.hbm2ddl.auto}道具>
  • 如果我使用JPA方式配置,我有hibernate 3.X依赖还是hibernate 4.X有什么区别?
猜你喜欢
  • 2012-01-20
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
相关资源
最近更新 更多