【问题标题】:Spring + Hibernate session managementSpring + Hibernate 会话管理
【发布时间】:2011-09-19 13:56:59
【问题描述】:

我一直在阅读有关将 Spring 与 Hibernate 结合使用的信息,但我对会话管理感到非常困惑。希望有人可以为我澄清一些事情,

首先,我不知道在使用 HibernateTemplate 时如何管理会话。当您在模板上调用方法(例如 Save())时,会话是否打开和关闭?使用 find() 方法时,是否返回分离的对象?

我已阅读有关事务的 Spring 部分,但它主要讨论处理异常。我希望找到某种将休眠会话绑定到 Spring 事务的方法,这样我就可以在事务完成时提交对休眠对象的更改。有没有办法做到这一点?

【问题讨论】:

    标签: hibernate spring


    【解决方案1】:

    Spring 为您管理会话。查看documentation,特别是第 13.3.1 节,您会看到

    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="mappingResources">
          <list>
            <value>product.hbm.xml</value>
          </list>
        </property>
        <property name="hibernateProperties">
          <value>
            hibernate.dialect=org.hibernate.dialect.HSQLDialect
          </value>
        </property>
      </bean>
    

    然后在第 13.3.3 节中你会看到这个

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

    如果你仔细看,你会发现会话工厂使用数据源,事务管理器使用会话工厂,这样 Spring 可以为你获取会话,并将所有持久性代码包装在事务中。

    【讨论】:

    • 它对实际发生的情况不是很清楚。如果此事务管理器用于特定方法,这是否意味着该方法内的所有数据库访问都将发生在同一个休眠会话中?如果我在此方法中加载休眠对象,是否会在方法结束时提交对它的更改?
    • @toc 事务管理器总是被使用。根据您指定要保护的方法的方式,它会做不同的事情。会话在关闭前自动刷新; hibernate 管理它,而不是 Spring。您应该检查 opensessioninview 过滤器。
    • @toc,如果你想知道它是如何工作的,我建议你下载源代码,然后使用你的调试器来遍历你的代码。
    • 但是打开和关闭会话的是 Spring 对吧?我问的原因是我想从我的代码中消除许多 save() 和 update() 方法调用。目前我正在使用 Dao 获取对象,然后修改它,然后调用 saveOrUpdate()。如果事务管理器在进入方法之前创建了一个会话并在退出时将其关闭,我就不需要调用 saveOrUpdate()。
    • 我个人不会担心调用 saveOrUpdate。会话将决定关闭时要做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2013-03-14
    • 2016-10-26
    • 2020-12-16
    • 2012-04-30
    • 2016-05-31
    相关资源
    最近更新 更多