Hibernate 1st Cache是​​否可以与HibernateTemplate一起使用?

时间:2013-06-07 08:34:05

标签: spring hibernate hql

我试图深入研究Hibernate缓存和Spring的HibernateTemplate,我对以下问题感到困惑:

1)HibernateTemplate如何管理Hibernate会话?如果我调用诸如“getHibernateTemplate()。find”和“getHibernateTemplate()。execute()”之类的方法,那么每次HibernateTemplate都会打开一个新的Hibernate会话进行处理吗?

2)Hibernate 1st缓存在Hibernate会话范围内工作。在这方面,如果HibernateTemplate总是打开一个新的会话来exeucte / find,那么它是否意味着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完成其工作,新创建的会话将被销毁。

我的理解对吗?

1 个答案:

答案 0 :(得分:2)

Spring documentation说明了有关会话访问和创建的内容:

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

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

--------------------------其他信息------------------- -------

编辑:为了回答作者的其他问题,文档对此并不十分明确,但在调用getSession()时获取或创建会话,其中包括对execute()的调用课程。当您仅实例化HibernateTemplate或从应用程序上下文中获取会话时,不会以任何方式创建或访问会话,因为可能会调用getHibernateTemplate()