首页 > 解决方案 > “无法初始化代理 - 没有会话”对于父级中的多个多对多关系

问题描述

我有一个具有多个多对多关系的父用户类。

@Table(name = "user")
public class User {
    ..
    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.DETACH})
    @JoinTable(
        name =  "user_address",
        joinColumns = { @JoinColumn(name = "user_id")},
        inverseJoinColumns = { @JoinColumn(name = "address_id")}
    )
    @JsonIgnore
    private final List<Address> addresses = new ArrayList<Address>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.DETACH})
    @JoinTable(
        name =  "reports",
        joinColumns = { @JoinColumn(name = "user_id")},
        inverseJoinColumns = { @JoinColumn(name = "reports_id")}
    )

    @JsonIgnore
    private final List<Reports> reports = new ArrayList<Reports>();
}

当我访问 FIRST ManyToMany 属性时,一切正常。但是,在访问第一个之后,当我尝试访问 SECOND ManyToMany 属性时,我得到“无法初始化代理 - 无会话”异常:

@Component
public class Combiner {
    public void combineData() {
        ...
        List<Address> addresses = user.getAddress(); // This works
        List<Reports> reports = user.getReports();   // Get the error here
        ..
    }
}

Address和类与上面的实体Reports有许多多对多的反比关系。User

public class Address {
    @ManyToMany(mappedBy = "addresses", fetch = FetchType.LAZY)
    private final List<User> users = new ArrayList<User>();
}

public class Reports {
    @ManyToMany(mappedBy = "reports", fetch = FetchType.LAZY)
    private final List<User> users = new ArrayList<User>();
}

我尝试搜索相同的错误,其中有像我这样的多个关系,第一次通过但第二次失败,但找不到帖子(或者谷歌无法理解搜索词,如果有人知道预先存在的一个 -请告诉我)。有人可以评估我还缺少什么吗?

到目前为止,我已经尝试过这些无济于事:

AM 使用 SpringBoot (2.2.4) 和 Hibernate Core {5.4.10.Final}

标签: spring-boothibernatejpa

解决方案


方法一: 单向@ManyToMany。异常清楚地表明它无法初始化role您在User课堂上的集合。

正如您在评论部分中所问的那样,为什么这个用例不能是双向的——您也可以这样bi-directional做。
方法二:制作role EAGER集合或者使用Hibernate.initialize()初始化集合。

奖励:您可以collection EAGER使用Setnot来制作两者List


推荐阅读