【发布时间】: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 完成它的工作,新创建的会话将被销毁。
我的理解对吗?
【问题讨论】: