我无法理解使用Hibernate Callback方法的优势,是否有任何优势或应在其中使用的特定用例。
public List findRecentRequests(final int offset, final int length) { List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query q = session.createQuery(FIND_RECENT_REQUESTS); q.setFirstResult(offset); q.setMaxResults(length); return q.list(); } }); return list; }
还有一个更重要的问题是,在查询返回值之后,HibernateCallback方法是否每次都会关闭会话吗?我有用例,每次刷新状态页时都会多次调用此函数,因此每次打开会话和查询数据库时都会调用此函数,或者将查询结果存储在内存中,然后每次调用此函数时,都会弹出结果从记忆里。
我已阅读(参考):
春天的HibernateTemplate.execute()默认在完成时关闭所有打开的会话。与延迟初始化一起使用时,您可能会收到类似以下内容的LazyInitializationException
org.hibernate.LazyInitializationException:无法初始化代理-没有会话
任何对相关文档部分的引用将不胜感激。
更新:
在我的情况下,我使用ejb事务并将其设置为“ support”,并且我认为在这种情况下,由于事务设置为support,因此它是可选的,因此每次创建新会话时,hibernate将查询数据库以获取结果,所以这就是有瓶颈,是否可以做出正确的假设?
就您为什么使用HibernateCallback。简短答案- 它允许您访问当前的事务绑定会话,以执行更复杂的hibernate功能。在大多数情况下,使用简单的方法就HibernateTemplate足够了,但是有时您需要使用Session。
HibernateCallback
HibernateTemplate
Session
这个难题有两个部分。
第一个是通过使用PlatformTransactionManager/ TransactionTemplateOR @Transactional注释定义的事务范围。有关更多信息,请参见spring docs / google。
PlatformTransactionManager
TransactionTemplate
@Transactional
第二个是,当您处于事务中时,HibernateTemplate将使用一些魔术与当前事务进行交互。
因此,像这样的简单操作hibernateTemplate.save()将参与交易。像您的示例这样更复杂的事务也将参与事务。实际上,hTemplate上的几乎任何方法都会参与。
hibernateTemplate.save()
因此,请问您有关会话何时关闭的问题
在上面第二种情况下要注意的重要一点是,没有显式事务。您受连接的自动提交模式的支配,因此您可能会在回调中执行保存,保存,引发异常的操作。第一次保存可能已提交,没有交易就无法保证。
我的建议是在进行任何更新时都使用事务。
如果您对交易的所有内容都不熟悉,请查看spring文档以获取交易章节。