我可以使用geCurrentSession()而不是使用HibernateCallback来获取会话吗?如果两个会话都由Spring管理,为什么我需要回调?这有与之相关的性能优势吗?
答案 0 :(得分:2)
在配置良好的Spring应用程序中,两者都是等效的,除非在一种情况下:当没有当前的事务上下文时。在这种情况下,getCurrentSession()将无法工作,而使用HibernateCallback将为您打开一个会话和一个Hibernate事务,并在最后关闭它们。
请注意,the documentation of HibernateTemplate提到应优先选择getCurrentSession():
注意:从Hibernate 3.0.1开始,事务性Hibernate访问代码可以 也可以用简单的Hibernate风格编码。因此,对于新开始 项目,考虑采用标准的Hibernate3编码风格 数据访问对象,而不是基于 SessionFactory.getCurrentSession()。
它还说:
请注意,HibernateTemplate将执行自己的会话管理, 除非参与自定义的Hibernate CurrentSessionContext 你明确地将“allowCreate”切换为“false”。
因此,混合两种做法并不是一个好主意。
我的首选是避免使用HibernateTemplate,直接使用Hibernate Session API,并使用Spring管理的声明式事务。