嘿我正在使用Spring和Hibernate开发一个桌面应用程序,我有一个懒惰启动的问题。我查看了网络,每个解决方案都与视图模式中的打开会话相关,但我无法使用此模式。我还尝试从sessionfactory
获取HibernateTemplate
,但它会返回给我一个断开连接的会话。
有谁知道其他解决方案?
答案 0 :(得分:4)
我建议你基本上有两个解决方案:
安排在访问延迟初始化的对象或集合时保持Hibernate会话处于打开状态。这意味着您将不得不在代码中仔细标记您的事务边界,即“在视图中打开会话”模式。 Spring使这成为可能,但在桌面应用程序中,它不会像事务边界更明显的Web应用程序那样简单。
关闭Hibernate中持久化对象的所有延迟初始化。
选项2可能导致大量不必要的数据库访问,选项1意味着您必须认真研究您的工作流程和用例。
希望有所帮助!
答案 1 :(得分:1)
一种选择是在实体或集合上调用Hibernate.initialize()来强制初始化它们。在将数据返回到视图之前,您需要执行此操作。我会仔细考虑这个问题,因为它会将大量的SQL语句生成回数据库。
您可能希望在HQL查询中使用“fetch”或在映射中将获取模式配置为“eager”(我相信它是JPA中的FetchMode.EAGER或hbm.xml中的lazy =“false”)。
@Jose:不要在自己的ThreadLocal中管理Session。使用SessionFactory.getCurrentSession()并配置Hibernate使用“线程”SessionContext。
答案 2 :(得分:1)
我有一个非常类似的问题,因为我无法找到任何真正合适的解决方案。我想出了一个自己的方法,结合了网上发现的许多不同的方法,并将它们发布到我的博客上。
很抱歉,我并没有把它全部放在这里,但是在我发现人们遇到这个或类似问题的所有论坛中一遍又一遍地做很多工作