使用HibernateTransactionManager获取jdbc模板

时间:2014-03-20 18:19:16

标签: java spring hibernate jdbctemplate

我正在开发一个spring应用程序,之前使用HibernateTransactionManager使用jdbc模板进行查询/更新的事务,并且工作正常。 以下是使用的代码

<bean id="sybaseDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="MySybaseDS"/>
    <property name="lookupOnStartup" value="false"/>
    <property name="cache" value="true" />
    <property name="proxyInterface"  value="javax.sql.DataSource" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="sybaseDataSource" />
    <property name="mappingResources">
        <list>..........</list>
    </property>
    <property name="hibernateProperties">
        <props>
             <prop key="hibernate.dialect">
                org.hibernate.dialect.SybaseAnywhereDialect
             </prop>
             <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven transaction-manager="txManager"/>

 <bean id="txManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
             <ref local="sessionFactory"/>
        </property>
 </bean>

我正在创建一个新的应用程序,现在混淆是使用HibernateTransactionManager还是JpaTransactionManager或两者(可能?)。

应用程序将使用HibernateTemplate和JdbcTemplate(用于批量更新)进行数据库操作,并且需要是事务性的。

我的意思是,我可以/应该使用HibernateTransactionManager进行jdbctemplate和HibernateTemplate数据库操作的事务吗?使用一个事务管理器而不是另一个事务管理器会有任何性能瓶颈吗?

2 个答案:

答案 0 :(得分:1)

简短的回答是它会起作用。有关底层详细信息的说明,另请参阅this thread

答案 1 :(得分:1)

如果应用程序是基于JPA的(已配置实体管理器工厂),则应使用JpaTransactionManager

此事务管理器在事务持续期间将实体管理器绑定到线程。

HibernateTransactionManager适用于不使用JPA但直接使用Hibernate的应用程序(已配置会话工厂)。

此事务管理器将hibernate会话绑定到线程而不是实体管理器。

它们基本相同,只有一个处理会话而另一个处理EntityManager。他们的选择完全取决于是否使用JPA。

根据各自的javadoc,两个事务管理器都与JdbcTemplate兼容。

使用一个事务管理器与另一个事务管理器没有性能影响。

实体管理器在内部使用Hibernate会话,因此最终结果是相同的:在事务持续期间,hibernate会话直接或间接绑定到线程。