使用休眠回调的优势?
问题描述
我无法理解使用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方法是否在查询返回值后每次都关闭会话?我有一个用例,在每次刷新状态页时都会多次调用此函数,因此每次打开会话和查询数据库时都会调用此函数,或者将查询结果存储在内存中,然后每次调用此函数时,都会弹出结果从记忆里。
我已阅读(Reference):
Spring HibernateTemplate.execute()默认在完成时关闭所有打开的会话。与惰性初始化一起使用时,您可能会收到LazyInitializationException,如下所示
org.hibernate.LazyInitializationException:无法初始化代理-没有会话
任何对相关文档部分的引用将不胜感激。
更新:
在我的情况下,我使用ejb事务并将其设置为“ support”,我认为在这种情况下,由于将事务设置为support,因此它是可选的,因此每次创建新会话时,hibernate都会查询数据库以获取结果,因此处于瓶颈,是否可以做出正确的假设?
解决方法:
这个难题有两个部分。
[第一个是通过使用PlatformTransactionManager
/ TransactionTemplate
或@Transactional
注释定义的事务范围。有关更多信息,请参见spring docs / google。
第二个是,当您处于事务中时,HibernateTemplate
将使用一些魔术与当前事务交互。
因此,一个简单的操作,例如hibernateTemplate.save()
将参与交易。像您的示例这样更复杂的事务也将参与事务。实际上,hTemplate上的几乎任何方法都可以参与。
所以请问您有关会话何时关闭的问题
如果您显式使用事务,请参见上面的第一点,然后在事务作用域关闭时,将提交事务,并关闭会话。
- [无事务时,每次调用
HibernateTemplate
方法,spring都会为您创建一个会话,然后立即关闭它。这不是首选方法,因为除非您执行非常简单的操作,否则结果将与会话分离,并且您将获得LazyInit异常。如果您对所有交易东西都不陌生,请查看交易章节的春季文档。