错误“未能懒惰地初始化角色集合(...)无法初始化代理 - 没有会话”在SO中被广泛讨论但是我想知道是否自我加入(例如,经理/员工关系)管理者也是员工)是一种特殊情况。我坦率地对错误及其解释感到困惑,但我认为我会从这个“特殊情况”问题开始,因为在我看来它可能是如此,所以如何处理错误的答案可能不适用于自我joins.I还会提到我正在使用Spring MVC,当我尝试向所有员工展示经理时会出现错误。
答案 0 :(得分:0)
如果延迟加载,则hibernate创建的实体对象不能在Service
和DAO
层之外正常运行。这是因为这样的对象是由hibernate创建的代理,只要代理保持连接到底层数据库(hibernate会话),只在需要时才加载字段。离开Service
或DAO
图层后,例如使用DAO
图层获取对象并尝试在控制器中使用它时,对象将断开连接并且任何尚未获取的字段将无法从数据库中获取数据。此外,您将无法将对象保存回数据库(您可以认为可以完成保存,但我不确定是否可以正确地完成复杂对象)。
解决方案是热切地加载对象,这意味着在创建对象时,所有字段都应该由hibernate加载(这是一项代价高昂的操作)。
(更好)替代解决方案是将控制器中的逻辑移动到服务层。