2008-09-23 63 views
3

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

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

回答

4

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

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

1

您正在寻找OpenSessionInView模式,它基本上是一个概念性过滤器(有时作为servlet过滤器实现),用于检测何时需要重新打开会话。几个框架实现这个,所以它自动处理它。

1

我正在写一个桌面应用程序,所以使用过滤器不适用。

+0

不要懒加载你的对象或编写你自己的缓存代码来延迟加载它们到你的数据模型中。 – RichH 2008-09-23 23:52:14

0

连接是一种稀缺资源,只要您使用它们就需要回收。如果您还在使用连接池,则在需要时再获取另一个应该很快。这是您必须使用的架构才能使网站规模扩大 - 即使您是桌面应用程序,他们的使用案例可能会集中在可扩展的网站上。

如果你看看MS ADO.NET,你会看到类似的重点是保持短时间连接 - 它们有一个完整的脱机模型,用于更新断开连接的数据,然后在准备好时应用到数据库。

2

我使用过EJB和Hibernate的桌面应用程序。我们必须在任何地方设置lazy=false,因为当对象被序列化时,它们失去了从后端获取的能力。不幸的是,事情就是这样。

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

+0

您不应该将懒惰设置为false。推荐使用查询中的联接抓取来覆盖初始化方案。 – bpapa 2008-09-24 05:27:01

0

Hibernate被设计为一种将对象映射到关系数据库表的方法。它很好地完成了这项工作。但是,它不可能让所有人都高兴。我认为在学习初始化的工作方式方面存在一些复杂性,但是一旦你掌握了它的意义,它就很有意义。我不知道它是否必须“专门设计”来激怒你,这只是它发生的方式。

如果要在非web应用程序中奇迹般地重新开启会话,我认为学习框架的复杂性会远远超出其好处。

+0

我从来没有说过我生气的方式。只是注意到我看到的设计缺陷。 – 2008-09-24 11:15:44

相关问题