【问题标题】:Hibernate advice (keeping session open)休眠建议(保持会话打开)
【发布时间】:2012-03-29 14:24:02
【问题描述】:

我来这里是为了提供一些建议。我正在使用带有 Java 的 Hibernate。我已经实现了一个控制器界面,以使用户界面与与数据库的实际通信保持距离。对于给定的接口,我实现了一个进行实际通信的数据库控制器类。这由静态控制器工厂提供给用户界面。

现在我发现 Hibernate 实际上并没有将我想要的所有内容加载到内存中。对于每个控制器方法调用,我总是打开会话,做我的事情,关闭会话。因此,当我尝试访问我的对象结构时,我会收到错误提示

could not initialize proxy - no Session

几乎没有努力和谷歌搜索,我得出结论,我的活动对象所引用的对象不在内存中。

现在我可以选择从我开始使用我的对象到结束时保持会话打开。但这似乎有点多余且能源效率低下。我想我不会因为保持会话打开而损失太多,但我有点打算让用户界面完全排除在数据库业务之外。让我的控制器界面为用户界面提供“tearDown”(和“setUp”)方法似乎有点违背给定的逻辑。

【问题讨论】:

  • 我们可能需要更多关于您的问题的详细信息,但我建议您查看stackoverflow.com/questions/8493087/…
  • 我实际上明白了原因,也明白了如何避免它。我想我应该更多地从事软件工程。我想我想知道处理 ORM 时的标准是什么,因为这是我第一次使用它。

标签: java hibernate session


【解决方案1】:

当您使用延迟加载时 - 这通常是 Hibernate 中的默认情况 - 在会话关闭后您无法访问已卸载的实例。

例如,您有一个父表和一个子表,它们以 1:n 关系映射(在映射文件中或作为注释)。然后你这样做:

1) 打开会话
2)加载父
3) 关闭会话
4) 调用 parent.getChild() (或者像这样)
然后在第 4 步)你会收到一条错误消息,因为 Hibernate 之前没有加载该项目,它现在想做(延迟加载),但它不能,因为会话已经关闭。

如果要关闭会话,请确保已加载所有必要的数据。例如,如果您在该示例中的步骤 3) 之前完成了步骤 4),那么它将起作用,并且在关闭会话后您甚至可以再次访问该子项,因为它已经被加载。但是由于会话关闭,您以后无法将其存储在数据库中。

【讨论】:

    【解决方案2】:

    我不明白。您可以从 db 加载实体对象并在关闭会话后使用它们。然后对象状态将被分离。您有时可能不得不将它们重新附加到会话以将它们的状态与 db 同步。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多