当前位置: 首页 > 面试题库 >

使用休眠回调的优势?

汪典
2023-03-14
问题内容

我无法理解使用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。简短答案-
它允许您访问当前的事务绑定会话,以执行更复杂的休眠功能。在大多数情况下,使用简单的方法就HibernateTemplate足够了,但是有时您需要使用Session

这个难题有两个部分。

第一个是通过使用PlatformTransactionManager/ TransactionTemplateOR
@Transactional注释定义的事务范围。有关更多信息,请参见spring docs / google。

第二个是,当您处于事务中时,HibernateTemplate将使用一些魔术与当前事务进行交互。

因此,像这样的简单操作hibernateTemplate.save()将参与交易。像您的示例这样的更复杂的事务也将参与事务。实际上,hTemplate上的几乎任何方法都会参与。

因此,请问您有关会话何时关闭的问题

  • 如果您明确使用事务,请参见上面的第一点,然后,当事务作用域关闭时,将提交事务,并关闭会话。
  • 如果没有事务,spring每次您调用一个HibernateTemplate方法都会为您创建一个会话,然后立即关闭它。这不是首选方法,因为除非您执行非常简单的操作,否则结果将与会话分离,并且您将获得LazyInit异常。

在上面第二种情况下要注意的重要一点是,没有显式事务。您受连接自动提交模式的支配,因此您可能会在回调中执行保存,保存,引发异常的操作。第一次保存可能已提交,没有交易就不能保证。

我的建议是在进行任何更新时都使用事务。

如果您对交易的所有内容都不熟悉,请查看spring文档以获取交易章节。



 类似资料:
  • 问题内容: 我有一个Spring和Hibernate3在生产中运行良好的应用程序。以下是Spring的applicationContext.xml中会话工厂的配置 生产正常。 现在,对于另一个项目,我们正在迁移到Hibernate4。我们使用org.springframework.orm.hibernate4。*包中的Hibernate 4的SessionFactory,TransacionMan

  • 问题内容: 我正在寻找展示如何将MongoDB与Hibernate集成的资源(最好是在Spring内),以便我可以在RDBMS和NoSql替代品之间进行切换:有人有这样做的经验吗? 问题答案: 您不能轻易做到这一点。Hibernate的重点是将Java对象映射到关系数据库。尽管Hibernate提取了许多细节,但您仍然需要了解关系数据库如何与诸如外键和主键之类的东西一起工作,以及运行查询对性能的影

  • 问题内容: 我试图使用Hibernate从Java调用Oracle9i DB中的遗留存储函数。该函数的声明如下: 经过几次失败的尝试和广泛的谷歌搜索之后,我在Hibernate论坛上发现了该线程,该线程建议了如下映射: 我执行它的代码是 结果日志是 任何提示我在做什么错?还是调用此存储函数的更好方法? 更新: 尝试@axtavt的建议时,出现以下错误: 该函数确实进行了大量的插入/更新,因此我想运

  • 问题内容: 我正在尝试在hibernate状态下使用mysql 字符串函数,但不幸的是我无法使用它,甚至无法通过创建这些注册函数来尝试 使用mysqldialect但没有人在工作..任何人都可以告诉我如何在hibernate状态下使用mysql字符串函数。或对上述寄存器功能的任何更改。 提前致谢, 最好的问候,拉贾。 问题答案: 通过扩展mysqldialect来创建一个类,如下所示 } 并在查询

  • 问题内容: 尝试将Hibernate与SAP HANA内存数据库连接时遇到一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。 因此,我将Hibernate设置为使用序列进行ID生成。 但是,当我插入大量记录(例如40000)时,Hibernate首先会生成ID。看起来像: 并且只有在生成所有ID之后,它才开始实际插入。

  • 问题内容: 我正在使用hibernate状态向下转换query.uniqueResult()来处理问题。我有2类:-UserBean-UserLogin 在第一个中,我具有所有表字段以及所有处理数据的方法的映射。相反,第二个仅代表将存储在用户会话中的一些用户数据。 在登录方法的特定点,我执行查询并得到1行(我已经检查了查询是否确实返回了一些结果)。关键是我无法从Object类型(即query.un