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