【问题标题】:Does Hibernate 1st Cache work with HibernateTemplate?Hibernate 1st Cache 是否与 HibernateTemplate 一起使用?
【发布时间】:2013-06-03 11:55:11
【问题描述】:

我正在尝试更深入地研究 Hibernate 缓存和 Spring 的 HibernateTemplate,但我对以下问题感到有些困惑:

1) HibernateTemplate 如何管理 Hibernate 会话?如果我调用“getHibernateTemplate().find”和“getHibernateTemplate().execute()”等方法,每次HibernateTemplate都会打开一个新的Hibernate会话来处理吗?

2) Hibernate 1st 缓存在 Hibernate 会话范围内工作。在这方面,如果 HibernateTemplate 总是打开一个新会话来执行/查找,那么这是否意味着 Hibernate 1st 缓存不能与 HibernateTemplate 一起使用? (因为缓存的对象无论如何都会被销毁,并且下一个 find() 必须进行新的查询才能再次从 DB 中获取所有内容)

3) 似乎 Hibernate 1st 缓存包含在会话生命周期内获取的所有对象的映射。在这种情况下,如果我查询之前在同一个会话中获取的对象,那么我应该直接从缓存中获取该对象及其所有数据吗?对此,如果该对象的数据在数据库中被修改了会怎样?

4) Hibernate 1st 缓存以对象格式返回数据,在这方面,如果我使用 HQL 从表(对象)中仅获取几列(属性),这些数据(对象只有其一部分正在填充的属性)也被缓存?

非常感谢!

-------------- 附加信息------ --------

感谢Alessio的提示,我重新检查了Spring规范,以下是我的理解:

如果我在现有事务块中调用 getHibernateTemplate()(例如,在“session.beginTransaction();”后面),那么 HibernateTemplate 将使用现有事务来执行。

如果我在当前线程中调用 getHibernateTemplate() 而没有事务,那么 getHibernateTemplate() 实际上会调用“openSession()”而不是“getCurrentSession()”,因为没有事务(即使之前调用过 openSession()并且打开的会话已经绑定到当前线程),并且将创建一个新会话并将其提供给 getHibernateTemplate()。一旦 getHibernateTemplate 完成它的工作,新创建的会话将被销毁。

我的理解对吗?

【问题讨论】:

    标签: spring hibernate hql


    【解决方案1】:

    Spring documentation 说了以下关于会话访问和创建的内容:

    "HibernateTemplate 知道当前线程绑定了一个对应的 Session,例如在使用 HibernateTransactionManager 时。如果 allowCreate 为 true,如果没有找到,将创建一个新的非事务性 Session,需要在最后关闭操作。如果为 false,则在这种情况下会抛出 IllegalStateException。"

    因此,它是否创建新会话取决于allowCreate 属性以及为当前线程设置会话的拦截器的存在。另请注意,HibernateTemplate 能够回退到 Hibernate 的 SessionFactory.getCurrentSession()。

    -------------- 附加信息 ------------------- -------

    编辑:回答作者的附加问题,文档对此不是很明确,但是在调用getSession() 时获得或创建了一个会话,其中当然包括对execute() 的调用。当您仅实例化 HibernateTemplate 或从应用程序上下文中获取它时,不会以任何方式创建或访问会话,正如对 getHibernateTemplate() 的调用可能所做的那样。

    【讨论】:

    • 您好 Alessio,感谢您的回复!我并没有真正从规范中得到意义。 “当前线程”在这里是什么意思,“当前线程”的范围是什么。目前我没有使用任何事务,因为 allowCreate 的默认值为 true,它是否真的证明了我的观点:每个 getHibernateTemplate() 创建一个新的(非事务性会话)来执行数据库 CRUD,因此休眠第一个缓存是在这种情况下实际上不可用?
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 2012-12-13
    • 2011-06-23
    • 2020-11-18
    • 2018-04-29
    • 2021-11-02
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多