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