我正在尝试更深入地研究 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 完成它的工作,新创建的会话将被销毁。
我的理解对吗?