当前位置: 首页 > 面试题库 >

org.hibernate.LazyInitializationException:无法初始化代理-没有会话,请再次确认

邓威
2023-03-14
问题内容

Foo看起来里面有这个:

@ManyToMany
private Set<User> favouritedBy;

当用户拥有此功能时:

@ManyToMany(mappedBy = "favouritedBy")
private Set<Foo> favourites  = new HashSet<Foo>();
public Set<Foo> getFavourites() {
  return favourite;
}

fooService拥有此功能,可以通过tranactional方法在打开会话时访问lazyloaded集合:

@Transactional(readOnly = true)
public Set<Foo> getFavourites(User user) {
user = dao.get(User.class, user.getId()); //the dao gets a session
Set<Foo> favourites = user.getFavourites();//but the session is not here and the exception is thrown?
return  favourties;
}

编辑 无需使用标准即可解决此问题:

Set<Foo> favourites = new HashSet<Foo>(user.getFavourites());

这用标准解决了

Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(Foo.class);
crit.setFetchMode("favourites", FetchMode.JOIN);
crit.add(Property.forName("id").eq(id));
return (Foo) crit.uniqueResult();

问题答案:

默认FetchTypeManyToManyLAZY和Hibernate文档与懒惰协会合作明确调用这种访问是错误的。只有在会话仍处于打开状态时,才能与延迟关联的对象进行交互。文档的该部分还提供了访问对象的这种延迟关联成员的替代方法。我们更喜欢JOIN在应用程序中按照所使用的标准指定获取方式

编辑

Set<Foo> favourites = user.getFavourites();

上面的语句实际上并不返回包含所有Foo对象的集合。它只是一个代理。Foo仅当像这样访问集合中的元素时才提取实际对象favorites.iterator()。显然,此操作发生在您的getFavorites()方法之外。但是该方法@Transactional上的注释getFavorites()指示该方法结束时将关闭会话。

因此,在收藏夹集上调用方法时,会话已经关闭,因此是异常。

为了解决这个问题,您应该使用Criteria对象检索用户并指定提取类型,JOIN以便在返回的User对象中填充Foo对象。



 类似资料:
  • 问题内容: 我有2台物理服务器,我的Web应用程序命中该服务器由负载均衡器管理。我总是得到- org.hibernate.LazyInitializationException:无法初始化代理-没有会话 当其中一台服务器受到攻击而另一台服务器运行平稳而没有任何问题时。我有一个由应用程序启用和管理的本地托管缓存存储。仅当尝试从一个表访问一个特定的列时,才会发生此异常。不管选择哪个服务器,其余的操作都

  • 问题内容: 我试图从数据库中的对象进行简单加载,但出现错误“无法初始化代理-没有会话”,知道吗?谢谢 问题答案: 尝试添加到validate方法: 发生的事情是,因为没有注释,所以没有与该方法关联的会话,并且每个查询都将在其自己的会话中运行,该会话随后将立即关闭。 该方法始终返回一个代理,与之不同(请参阅此处,了解load与get之间的差异)。 因此,返回了代理,但是由于缺少代理,因此立即关闭了创

  • 我试图从DB中的一个对象做一个简单的加载,但是我得到的错误是“Could not initialize proxy-no session”,有什么想法吗?谢谢

  • 我正在尝试使用Primeface JSF Spring Boot做一个示例User CRUD页面。在页面上,我有一个启用LazyLoding的表。我的User对象没有1对N或N对1字段,都是原始字段,在到达时不需要数据库访问或初始化。(所以FetchType.EAGER不会有帮助) 当试图在弹出窗口上显示用户列表中的用户时,出现以下异常: 为什么 JSF 组件尝试从数据库中更新对象以获取 1 比

  • 问题内容: 对数据库有以下查询: 在获取employee.address.street,employee.address.houseNumber或employee.address.city时,它将失败,但以下情况除外: 员工映射: 地址映射: 对于其他类(办公室,公司等),这​​是绝对正常的。如果注释,则在jsp应用程序中加载地址字段的行将正常工作。怎么了?顺便说一下,尽管有异常,它仍显示有关js

  • 抱歉,如果我的帖子是重复的,但我不能从另一个主题解决我的问题,所以我创建了这个主题。希望有人帮助我。我用的是Hibernate,JSF和Glassfish。 这是我的完整代码 CusterBean(请求范围) 顾客道 xhtml 我得到这个错误: SEVERE:javax.el.ELException: /admin/customer_list.xhtml@68,106 value="#{cust