【发布时间】:2017-10-08 20:40:43
【问题描述】:
我遇到了一个例外^ 目标 VM 中发生异常:无法延迟初始化集合,没有会话或会话已关闭 org.hibernate.LazyInitializationException: 延迟初始化集合失败,没有会话或会话被关闭
我不明白我为什么会遇到问题。我不使用延迟加载。这是我的 Role.hbm.xml:
<hibernate-mapping>
<class name="ru.itlect.bzdur.security.Role" table="Roles" >
<meta attribute="class-description">
</meta>
<id column="id" name="id" type="int">
<generator class="native"/>
</id>
<property column="displayName" name="displayName" not-null="true" type="string"/>
<property column="removed" name="removed" not-null="true" type="boolean"/>
<property column="hidden" name="hidden" not-null="true" type="boolean"/>
<property column="system" name="system" not-null="true" type="boolean"/>
<set name="permitionParams" table="Permitions" inverse="true" lazy="false" fetch="select" cascade="all" >
<key>
<column name="RoleID" not-null="true" />
</key>
<one-to-many class="ru.itlect.bzdur.security.PermitionParam" />
</set>
</class>
</hibernate-mapping>
比较奇怪的是我松Hibernate Session的地方。角色.java:
public class Role {
private int id;
private Set<PermitionParam> permitionParams;
private final Map<String, PermitionParam> permitionMap = new HashMap<>();
...
public void setPermitionParams(Set<PermitionParam> permitionParams) {
permitionMap.clear();
if(permitionParams == null){
this.permitionParams = new HashSet<>();
return;
}
this.permitionParams = permitionParams;
for(PermitionParam param : permitionParams){
permitionMap.put(param.getPermition().getName(), param);
}
}
...
}
当我调用 CrudRepository 的 save() 方法时,抛出异常就行了:for(PermitionParam param : permitionParams){。 Hibernate 创建 Role 对象的新副本并调用它的 setter。我不明白我怎么能在那一刻失去会话。
请帮帮我。
【问题讨论】: