0

我正在尝试更深入地研究 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 规范,以下是我的理解:

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

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

我的理解对吗?

4

1 回答 1

2

Spring 文档对会话访问和创建进行了以下说明:

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

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

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

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

于 2013-06-07T09:07:37.100 回答