org.hibernate.lazyinitialization例外

Nan*_*ale 3 java hibernate spring-mvc java-ee

org.hibernate.LazyInitializationException:无法懒惰地初始化角色集合:pojo.Person.address,没有关闭会话或会话.

我得到这个例外,我正在使用Spring 3.0和Hibernate 3.6.

Ale*_*nes 8

看起来你有一个名为Person的实体,它有一个延迟加载的映射地址集合?您已加载Person,其加载的会话现已关闭.

会话关闭后,您尝试访问该地址集合,Hibernate尝试加载它们.但是,如果原始会话不再可用,则无法进行此操作.

要访问地址属性,您有以下几种选择:

  1. 使用OpenSessionInView模式确保Hibernate会话在请求/响应周期期间保持打开状态(因为您已经标记了Spring MVC,我将假设这是一个基于Web的操作).这实质上将您的Hibernate会话范围限定为HTTP请求.

  2. 确保在关闭会话(提交事务)之前加载所有必需的属性.你可以使用

    同样,Hibernate.initialize(person.address)

或者编写使用左连接提取的HQL.这可能是这样的:

createQuery("from Person as person left join fetch person.address")
Run Code Online (Sandbox Code Playgroud)

这将仅覆盖此查询的任何延迟加载配置,并确保初始化任何集合.