代码之家  ›  专栏  ›  技术社区  ›  Allain Lalonde

为什么Hibernate似乎是为短期会话设计的?

  •  3
  • Allain Lalonde  · 技术社区  · 16 年前

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

    为什么他们没有设计成自动重新打开会话,或者会话始终保持打开状态?

    6 回复  |  直到 16 年前
        1
  •  4
  •   RichH    16 年前

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

    我猜您想从视图中延迟加载对象-看一看 here

        2
  •  2
  •   davetron5000    16 年前

    我在一个使用EJB和Hibernate的桌面应用程序上工作。我们必须出发 lazy=false 到处都是,因为当对象被序列化时,它们就失去了从后端获取的能力。不幸的是,事情就是这样发展的。

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

        3
  •  1
  •   David M. Karr    16 年前

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

        4
  •  1
  •   Allain Lalonde    16 年前

    我正在编写一个桌面应用程序,因此使用过滤器是不适用的。

        5
  •  0
  •   Lou Franco    16 年前

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

    如果您查看MS ADO.NET,您将看到一个类似的焦点,即在短时间内保持连接打开——它们有一个完整的脱机模型,用于更新断开连接的数据,然后在准备就绪时应用于数据库。

        6
  •  0
  •   bpapa    16 年前

    Hibernate被设计为一种将对象映射到关系数据库表的方法。它很好地完成了那项工作。但是,它不能总是让每个人都满意。我认为学习初始化如何工作有些复杂,但一旦掌握了窍门,它就有了意义。我不知道这是否一定是专门为了激怒你而设计的,这只是事情发生的方式。

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