【问题标题】:Exception occurred in target VM: failed to lazily initialize a collection, no session or session was closed目标 VM 中发生异常:未能延迟初始化集合,没有会话或会话已关闭
【发布时间】: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。我不明白我怎么能在那一刻失去会话。

请帮帮我。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    解决方法是在传递到服务层之前,您需要在事务中初始化惰性对象。看这里更多herehere

    【讨论】:

    • 我根本不想使用延迟加载。
    • 在我可以将对象传递到任何地方之前,Hibernate 中会引发异常。
    猜你喜欢
    • 2011-07-18
    • 2011-12-11
    • 1970-01-01
    • 2011-03-31
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2013-12-23
    相关资源
    最近更新 更多