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