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

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

【问题讨论】:

    标签: java spring jdbc jdbctemplate


    【解决方案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。我需要数据源。
      猜你喜欢
      • 2021-08-30
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2011-11-22
      • 1970-01-01
      • 2017-04-01
      • 2012-12-24
      相关资源
      最近更新 更多