将 JDBCTemplate 与 Hibernate SessionFactory 一起使用?

Posted

技术标签:

【中文标题】将 JDBCTemplate 与 Hibernate SessionFactory 一起使用?【英文标题】:Using JDBCTemplate with a Hibernate SessionFactory? 【发布时间】:2009-08-26 18:22:29 【问题描述】:

我们有一个 Spring/Hibernate 应用程序,出于性能和开发时间的原因,希望添加少量 JDBC。我可以使这个 dao 子类 HibernateDaoSupport 并使用会话的连接来执行我的 JDBC,但我宁愿使用 JdbcTemplate。然而,JdbcTemplate 是使用 java.sql.Datasource 初始化的。如何使用现有的 Hibernate SessionFactory 对其进行初始化?

【问题讨论】:

【参考方案1】:

您是否不需要为 SessionFactory 实现提供数据源?为什么不将它连接到 JDBC 模板?

您使用的是哪个 SessionFactory 实现?如果您使用的是 Spring 实现,请参阅 AbstractSessionFactoryBean.html#getDataSource()

【讨论】:

我们的会话工厂是使用使用休眠属性初始化的 AnnotationSessionFactoryBean 创建的。我们没有创建和初始化数据源。我无法从 SessionFactoryBean 中提取数据源,因为我无法保留对它的引用: ... hibernateSessionFactory 是一个 SessionFactory。如何获得对 SessionFactoryBean 的引用? 您的自定义 SessionFactoryBean 为构建 SessionFactory 做了什么?在最坏的情况下,您是否至少在休眠属性中提供了 JDBC 驱动程序名称和连接 URL?如果是这样,您应该能够从中实例化一个 DataSource 。更好的是,构建一个 DataSource 并在 SessionFactoryBean 和 JDBCTemplate 之间共享它 自定义 FactoryBean 与此问题无关。它是 AnnotationSessionFactoryBean 的子类。出于维护原因,我不想引入另一个数据源,从我们的休眠配置中提取数据源似乎需要做很多工作。回想起来,它本来应该是这样创建的,但事实上,该应用程序本质上是转换为 Spring 的。我只是要使用hibernate 的createSQLQuery() 而不是JdbcTemplate。感谢您的帮助。【参考方案2】:

您始终可以使用休眠会话的doWork 方法 - 这会为您提供 java.sql.Connection。您可以使用此连接构造一个 SingleConnectionDataSource 构造(注意:第二个参数应始终为真,因为您不想关闭底层连接)并将此数据源传递给您的 JDBCTemplate...

【讨论】:

【参考方案3】:

"从我们的 休眠配置似乎 我需要做很多工作”

我不明白为什么需要这么多工作。只需创建、剪切和复制几个标签和属性。

例如:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
      <property name="dataSource">
          <ref bean="dataSource"/>    
      </property>
...
</bean>

"哪个SessionFactory实现 你正在用吗?如果您正在使用 Spring 实现,请参阅 AbstractSessionFactoryBean.html#getDataSource()"

显然,getDataSource() 仅适用于 Spring 2.5。这是参考:Click here

Spring 2.0 没有 getDataSource()。这是参考:Click here

我们的会话工厂是使用 AnnotationSessionFactoryBean 用休眠属性初始化 ... hibernateSessionFactory 是一个 会话工厂。我怎么会得到一个 引用 SessionFactoryBean?

我想知道您为什么使用 SessionFactory 而不是作为 AnnotationSessionFactoryBean 子类的 LocalSessionFactoryBean?

bean id="hibernateSessionFactory" 行不是已经引用了 SessionFactoryBean 吗?

【讨论】:

我猜“很多工作”是一个相对术语。就我而言,我需要创建一个基于 c3p0 的数据源,并将我们所有的设置从原始属性文件转换为这个文件。在 Hibernate 和 c3p0 之间的某些设置上,属性名称会发生​​变化,因此我需要全部验证它们。完成和验证可能需要大约一个小时,但考虑到收益只是在一个 dao 中使用 JDBCTemplate,不值得花时间。 AnnotationSessionFactoryBean 是 LocalSessionFactoryBean 的子类。对会话工厂的引用并不能帮助我初始化 JDBCTemplate。我需要数据源。

以上是关于将 JDBCTemplate 与 Hibernate SessionFactory 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernat 原生SQL运行结果集处理方法

spring boot中使用JdbcTemplate

SpringSpring JDBCTemplate

将不同类型的参数传递给jdbctemplate查询

使用 Spring JdbcTemplate - 注入数据源与 jdbcTemplate

JdbcTemplate RowMapper接口