spring-data-jpa多对多双向映射,查询进入死循环

发布于 2022-09-06 02:21:46 字数 1833 浏览 12 评论 0

两个实体类

User
@Data
@Entity
@Table(name = "sys_user")
public class User {
    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private Integer userId;
    @Column(name = "username")
    private String username;
    @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    @JoinTable(
            name = "user_role",
            joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")}
    )
    private Set<Role> roles;
}
Role
@Data
@Entity
@Table(name = "sys_role")
public class Role {
    @Id
    @Column(name = "role_id")
    private Integer roleId;
    @Column(name = "role_name", unique = true)
    private String roleName;
    @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, mappedBy = "roles")
    private Set<User> users;
测试代码
    @Transactional
    @Test
    public void save() throws Exception{
        Set<Role>roles = new HashSet<Role>();
        roles.add(new Role(1, "USER"));
        roles.add(new Role(2, "ADMIN"));

        repository.save(new User("张三", roles));
    }

    @Transactional
    @Test
    public void findAll(){
        List<User> users = repository.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }

在使用插入数据的时候没有任何问题,但是当查询的时候报错

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: wang.xiaoqiang.manytomany.entity.User.roles, could not initialize proxy - no Session

这个可以理解,懒加载的时候丢失了session无法获取roles信息,当将user中的集合设置为急加载模式fetch = FetchType.LAZY,结果就遇到StackOverflowError

哪位大佬有相关经历,帮帮忙。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

擦肩而过的背影 2022-09-13 02:21:46

之前用JUnit进行单元测试的时候遇到过类似的问题

可以尝试在单元测试类上添加@TestExecutionListeners注解,并传入一个数组,数组中包含TransactionalTestExecutionListener.class

划一舟意中人 2022-09-13 02:21:46

User类里加上@JsonIgnoreProperties(value = { "users" }),Role类里加上@JsonIgnoreProperties(value = { "roles" }),在循环的时候过滤某个字段,在自己的实体里过滤自己,就不会查到第二遍了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文