【问题标题】:Why does Hibernate seem to be designed for short lived sessions?为什么 Hibernate 似乎是为短期会话而设计的?
【发布时间】:2008-09-24 13:30:06
【问题描述】:

我知道这是一个主观问题,但为什么 Hibernate 似乎是为短期会话而设计的?通常在我的应用程序中,我创建 DAO 来抽象我的数据层,但由于我无法预测实体对象将如何使用,它的一些集合是延迟加载的,或者我应该说一旦会话关闭就无法加载。

他们为什么不设计它以使其自动重新打开会话,或者让会话始终保持打开状态?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    因为一旦您移出事务边界,您就无法在不启动新事务的情况下再次访问数据库。 “以防万一”进行长时间运行的交易是一件坏事(tm)。

    我猜你想从你的视图中延迟加载对象 - 看看here 的一些选项。我更喜欢准确定义我的会话外观方法将返回多少对象映射。我发现这让我的业务层的单元测试和性能测试变得更加容易。

    【讨论】:

      【解决方案2】:

      我开发了一个使用 EJB 和 Hibernate 的桌面应用程序。我们必须在任何地方设置lazy=false,因为当对象被序列化时,它们就失去了从后端获取的能力。不幸的是,事情就是这样。

      如果您关心性能,您可以在后端使用缓存,这样您的非延迟提取就不会那么痛苦。

      【讨论】:

      • 你不应该将lazy设置为false。通过在查询中获取连接来覆盖初始化方案是推荐的方法。
      【解决方案3】:

      您正在寻找 OpenSessionInView 模式,它本质上是一个概念过滤器(有时实现为 servlet 过滤器),用于检测何时需要透明地重新打开会话。有几个框架实现了这一点,因此它会自动处理它。

      【讨论】:

        【解决方案4】:

        我正在编写一个桌面应用程序,所以使用过滤器不适用。

        【讨论】:

        • 不要延迟加载您的对象或编写您自己的缓存代码来延迟加载它们到您的数据模型中。
        【解决方案5】:

        连接是一种稀缺资源,一旦使用完毕就需要回收。如果您还使用连接池,那么在需要时获取另一个连接池应该很快。这是您必须用来使网站扩展的架构——即使您是桌面应用程序,它们的用例也可能集中在可扩展的网站上。

        如果您查看 MS ADO.NET,您会发现类似的重点是在短时间内保持连接打开——它们有一个完整的离线模型,用于更新断开连接的数据,然后在您准备好时应用到数据库。

        【讨论】:

          【解决方案6】:

          Hibernate 旨在将对象映射到关系数据库表。它很好地完成了这项工作。但是,它不能一直取悦所有人。我认为学习初始化是如何工作的有一些复杂性,但是一旦你掌握了它,它就有意义了。我不知道它是否一定是“设计”来专门激怒你,这就是它发生的方式。

          如果它要神奇地重新打开非 web 应用程序中的会话,我认为学习该框架的复杂性将远远超过其好处。

          【讨论】:

          • 顺便说一句,我从来没有说过我很生气。只是注意到我认为的设计缺陷。
          猜你喜欢
          • 2013-03-15
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 2010-10-09
          • 1970-01-01
          • 2014-02-02
          • 1970-01-01
          • 2010-12-15
          相关资源
          最近更新 更多