目标VM发生异常:未能懒惰地初始化集合,没有关闭会话或会话

时间:2017-05-10 09:22:52

标签: java hibernate

我得到了例外^     目标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的地方越奇怪。 Role.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);
        }
    }
...
}

Exception被抛出:for(PermitionParam param:permitionParams){,当我调用CrudRepository的save()方法时。 Hibernate创建Role对象的新副本并调用其setter。我不明白如何在那一刻松开会议。

请帮帮我。

1 个答案:

答案 0 :(得分:0)

修复是你需要在传递到服务层之前在事务中初始化延迟对象。在这里查看更多herehere