我知道这是一个主观问题,但为什么 Hibernate 似乎是为短期会话而设计的?通常在我的应用程序中,我创建 DAO 来抽象我的数据层,但由于我无法预测实体对象将如何使用,它的一些集合是延迟加载的,或者我应该说一旦会话关闭就无法加载。
为什么他们不设计它以使其自动重新打开会话,或者让会话始终保持打开状态?
因为一旦您移出事务边界,您就无法在不启动新事务的情况下再次访问数据库。“以防万一”进行长时间运行的交易是一件坏事(tm)。
我猜你想从你的视图中延迟加载对象 - 看看这里的一些选项。我更喜欢准确定义我的会话外观方法将返回多少对象映射。我发现这使得单元测试和性能测试我的业务层变得更容易。
我在一个使用 EJB 和 Hibernate 的桌面应用程序上工作。我们必须lazy=false
到处设置,因为当对象被序列化时,它们就失去了从后端获取的能力。不幸的是,事情就是这样。
如果您关心性能,您可以在后端使用缓存,这样您的非延迟提取就不会那么痛苦。
您正在寻找 OpenSessionInView 模式,它本质上是一个概念过滤器(有时实现为 servlet 过滤器),用于检测何时需要透明地重新打开会话。几个框架实现了这一点,因此它会自动处理它。
我正在编写一个桌面应用程序,因此使用过滤器不适用。
连接是一种稀缺资源,一旦你用完它们就需要回收。如果您还使用连接池,那么在需要时获取另一个连接池应该很快。这是您必须用来使网站扩展的架构——即使您是桌面应用程序,它们的用例也可能集中在可扩展的网站上。
如果您查看 MS ADO.NET,您会发现类似的焦点是在短时间内保持连接打开——它们有一个完整的离线模型,用于更新断开连接的数据,然后在您准备好时应用到数据库。
Hibernate 被设计为一种将对象映射到关系数据库表的方法。它很好地完成了这项工作。但是,它不能一直取悦所有人。我认为学习初始化是如何工作的有一些复杂性,但是一旦你掌握了它,它就有意义了。我不知道它是否一定是“设计”来专门激怒你,这就是它发生的方式。
如果它要神奇地重新打开非 web 应用程序中的会话,我认为学习框架的复杂性将远远超过好处。