带有FetchType.LAZY的LazyInitializationException和NonUniqueObjectException解决方案

时间:2015-06-19 13:37:46

标签: java hibernate session

如果我有一个包含Kid列表的Mother类,我想懒惰地使用FetchType.LAZY加载Kid列表,我该如何构建我的DAO?

目前,如果我从DAO获取对象并且没有关闭会话,我会得到大量的

  

org.hibernate.NonUniqueObjectException:一个不同的对象   相同的标识符值已与会话相关联

因为会话最终会出现同一个Object的不同实例。

如果我热心地关闭了DAO中的会话,我最终得到了分离的对象,并且我第一次尝试使用以下内容访问其中一个延迟加载的对象:

List<Kid> kidList = mother.getKids();
kidList.add(new Kid());

我得到了

  

org.hibernate.LazyInitializationException:懒得初始化   角色集合:Mother.kids,无法初始化代理 - 没有   会话

我碰巧看到的唯一解决方案是:

  1. 不使用DAO并直接在代码中添加open()和close()会话调用,存在忘记关闭一个会话的风险。
  2. 在这里和那里滥用FetchType.EAGER来解决问题
  3. 避免访问分离对象内的延迟加载对象,并使用另一种DAO方法来获取孩子,例如KidDao.getKidsofMother(Long motherId)。
  4. 使用Session.merge(mother)重新附加分离的对象,然后访问该集合。
  5. 对此没有一些优雅的解决方案吗?

0 个答案:

没有答案