我最近采用了我们项目的数据库/休眠方面,并且在理解关于使用管理会话的设计基础知识方面遇到了很多麻烦。我应该使用非静态会话的静态吗?
我们有一个util类,它包含一个只初始化一次的静态会话。会话的检索由系统中的每个DAO通过一个静态方法getBoundSession()来使用。该应用程序全天候运行。这是一个常见的设计?
其中一个非常有用的好处是可以在整个业务逻辑层中使用域对象上的懒惰属性/集合,因为会话始终处于打开状态。另一个好处是,retreived对象将保持在会话中缓存。
我觉得我们必须以一种错误的方式使用Hibernate,看起来只有一次永久打开的会话似乎不正确。当单独的线程正在使用util类时,它也会导致问题,从而共享会话。另一方面,我无法找到一种方法来实现上述优点(特别是第一种)采用不同的设计。任何人都可以对此有所了解吗?
感谢
詹姆斯
非常感谢您的回复。我一定会离开并阅读第11章。如果你不介意的话,最后一个问题是:我们有一个7级的类层次结构(通常是一对多关系),我担心显式加载这个层次结构将是非常重要的昂贵而没有延迟加载。这种紧密耦合的领域模型是否具有设计缺陷?我认为这一定是我们静态会话背后的推理。 – James 2010-06-23 16:22:55
@James:如果你不使用OSIV模式,我不是故意要说“不要使用延迟加载”,而是要明确*提取所需的数据。不,我不认为你的设计是有缺陷的。 – 2010-06-23 16:36:30
假设我们有一个层次:'客户'有许多'订单'有许多'产品'有许多'材料' 由于我们已经使用了一个静态会话,在总线逻辑中一个客户被加载,通过从方法到方法延迟加载成员许多次 - 比如计算每个订单的产品数量,以及订单中最昂贵的材料。 如果会话已关闭,则延迟加载无用,因此业务逻辑无法导航对象图。所以我只能想到业务层管理会话(这看起来很糟糕?),或者删除客户的深度并添加DAO,例如查找最昂贵的材料。 – James 2010-06-23 17:19:50