【问题标题】:Spring and Hibernate, Lazy initiation problemSpring和Hibernate,延迟启动问题
【发布时间】:2009-01-08 13:57:43
【问题描述】:

嘿,我正在使用 Spring 和 Hibernate 开发一个桌面应用程序,但我遇到了延迟启动的问题。我在网上查看,每个解决方案都与视图模式中的打开会话有关,但我不能使用这种模式。我也尝试从HibernateTemplate 获取sessionfactory,但它返回给我一个断开连接的会话。

有人知道其他解决方案吗?

【问题讨论】:

  • 到底是什么问题?有任何 hbms 和 cfgs 文件给我们吗?你真的需要给我们更多的细节。
  • 我相信你不能使用 Open Session in View 模式,但我很好奇为什么会这样。你能详细说明一下吗?

标签: java hibernate spring lazy-loading


【解决方案1】:

我建议你基本上有两种解决方案:

  1. 当您访问延迟初始化的对象或集合时,请安排保持 Hibernate 会话打开。这意味着您必须在代码中仔细标记事务边界,类似于“视图中的打开会话”模式。 Spring 使这成为可能,但在桌面应用程序中它不会像事务边界更加明显的 Web 应用程序那样简单。

  2. 关闭 Hibernate 中持久对象的所有延迟初始化。

选项 2 可能会导致大量不必要的数据库访问,而选项 1 意味着您必须认真研究您的工作流程和用例。

希望有帮助!

【讨论】:

  • 我做了类似于第一个选项的事情...我已经更改了应用程序上下文以在每个业务类方法中建立事务边界。谢谢魔力
【解决方案2】:

一种选择是在实体或集合上调用 Hibernate.initialize() 来强制初始化它们。您希望在将数据返回到视图之前执行此操作。我会仔细考虑这一点,因为它会生成大量的 SQL 语句返回数据库。

您可能希望考虑在 HQL 查询中使用“fetch”,或在映射中将 fetch 模式配置为“eager”(我相信它是 JPA 中的 FetchMode.EAGER 或 hbm.xml 中的lazy="false")。

@Jose:不要在你自己的 ThreadLocal 中管理 Session。使用 SessionFactory.getCurrentSession() 并配置 Hibernate 以使用“线程”SessionContext。

【讨论】:

  • 我已经尝试过这种方式,但我不起作用。 Spring 每次操作使用一个会话,因此当我尝试调用任何 Hibernate 方法时,它说没有会话或会话已关闭。无论如何谢谢
【解决方案3】:

我有一个非常相似的问题,因为我无法找到任何真正合适的解决方案。我想出了自己的一个,结合了网上找到的许多不同的方法,并将它们发布到我的博客上。

对不起,我没有把它全部放在这里,但是在我发现有人遇到这个或类似问题的所有论坛中一遍又一遍地做这件事是很多工作

Remote Lazy Loading with Hibernate and Spring

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2021-02-01
    • 2011-03-28
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多