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

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

有帮助吗?

解决方案

如果您离开事务边界,则无法在不启动新事务的情况下再次访问数据库。长时间运行交易“以防万一”是件坏事(tm)。

我想你想从你的视图中延迟加载对象 - 看看这里一些选择。我更喜欢定义我的会话Facade方法将返回多少对象映射。我发现这样可以更轻松地对我的业务层进行单元测试和性能测试。

其他提示

我在一个使用EJB和Hibernate的桌面应用程序上工作。我们不得不在任何地方设置 lazy = false ,因为当对象被序列化时,它们将失去从后端获取的能力。不幸的是,这就是它的方式。

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

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

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

连接是一种稀缺资源,需要在使用后立即回收。如果您还使用连接池,则在需要时再使用连接池应该很快。这是您必须使用的架构,以使网站扩展 - 即使您是桌面应用程序,它们的用例可能集中在可扩展的站点上。

如果你看一下MS ADO.NET,你会看到类似的重点是保持连接在短时间内保持打开状态 - 他们有一个完整的离线模型,用于更新断开连接的数据,然后在准备就绪时应用于数据库。 / p>

Hibernate旨在将对象映射到关系数据库表。它很好地完成了这项工作。但是,它无法让所有人满意。我认为在学习初始化如何工作方面有一些复杂性但是一旦掌握了它,它就有意义了。我不知道它是否必然是“设计”的。特别要激怒你,这就是它发生的方式。

如果要在非webapps中神奇地重新开放会话,我认为学习框架的复杂性远远超过了好处。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top