当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA @OneToMany无限循环异常

秋阳旭
2023-03-14

使用具有Hibernate状态的Spring Data JPA作为提供者导致无限循环的OneTo多国关系

这里的问题不是异常的类型,而是导致这个异常的无限循环

我尝试@JsonIgnoreProperties这给了我另一个错误=

后引用的解决方案没有解决我的问题的解决方案。

一种说法是使用@ JsonManagedReference和@JsonBackReference,这确实停止了递归,但是从结果中排除了对象(' myUser '实体中的用户组),当我想要一个' myUser '实体的对象时,我需要这个结果。

另一个说重写ToString方法,我没有这样做。

另一个解释了为什么有一个无限循环,并建议作为解决方案,不要这样做。我引用了“尝试从返回的模型中创建没有周期的DTO或Value对象(简单POJO),然后返回它。”

@JsonIgnore和@JsonBackReference之间的区别,@JsonManagedReference解释了这一区别,但这样做我会遇到与第一个相同的问题

“我的用户”实体

@Entity
public class MyUser {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String firstName;
  private String lastName;
  private String email;
  private Integer age;

  //@JsonIgnoreProperties({"myUsers"})
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "userGroupId")
  private UserGroup userGroup;

“用户组”实体

@Entity
public class UserGroup {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Integer groupOrder;
    @OneToMany
    (
        mappedBy = "userGroup", 
        cascade = CascadeType.ALL, 
        orphanRemoval = true
    )
    private List<MyUser> myUsers;

共有3个答案

尉迟雅昶
2023-03-14

我想我明白你的问题了。您希望在不使用循环引用的情况下获取MyUser,包括userGroupdata。

根据你列举的解决方案,我建议你仍然应该使用@JsonBackReference@JsonManagedReference来防止实体上的递归,对于你的问题的解决方案,你可以尝试使用映射器(MapStruck)并在从服务检索数据期间将用户组详细信息映射到DTO。

避免双重征税:

public class MyUserDto {
    private Long id;
    private String firstName;
    private String lastName;
    private String email;
    private Integer age;
    private UserGroupDto userGroupDto;
}

public class UserGroupDto {
    private Long id;
    private Integer groupOrder;
}

映射器(MapStruck):

@Mapper(componentModel = "spring")
public interface MyUserMapper {

    MyUserMapper INSTANCE = Mappers.getMapper(MyUserMapper.class);
    
    UserGroupDto userGroupToDto(UserGroup userGroup);

    @Mapping(source = "myUser.userGroup", target = "userGroupDto")
    MyUserDto myUserToDto(MyUser myUser);
}

存储库中检索数据后,可以调用 myUserToDto 方法将实体映射到 DTO。

这只是解决您的问题的一种方法。

潘胤
2023-03-14

您需要在< code>@OneToMany处添加< code>@JsonIgnore批注

这样地

@JsonIgnore   
@OneToMany
    (
        mappedBy = "userGroup", 
        cascade = CascadeType.ALL, 
        orphanRemoval = true
    )
    private List<MyUser> myUsers;
荣晨朗
2023-03-14

如下所示,更改MyUser类中的< code>getUserGroup()方法。

@Entity
public class MyUser 
{    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;
    private String lastName;
    private String email;
    private Integer age;

    //@JsonIgnoreProperties({"myUsers"})
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "userGroupId")
    private UserGroup userGroup;

    public UserGroup getUserGroup() 
    {
        userGroup.setMyUsers(null);
        return userGroup;
    }
}
 类似资料:
  • 编辑:这里是我正在使用的架构

  • 此特定环境下的程序:EJB3.0 JPA jersey Web Service 第一个实体: 第二实体: 当我拿到班级考试的学生名单时。例外情况是: 如果我更改fetch FetchType。懒惰例外情况是: 如何解决我的问题?

  • 问题内容: 我的问题很简短。我不明白为什么我的程序在捕获错误时会无限循环。我做了一个新的try- catch语句,但是它循环了,甚至复制,粘贴并修改了以前有效的程序中的适当变量。下面是语句本身,下面是整个程序。谢谢您的帮助! 程序: 问题答案: 您的程序将永远运行,因为在不更改扫描仪状态的情况下进行调用会一次又一次地引发异常:如果用户未输入,则调用不会更改扫描仪的外观,因此,当您在下一次迭代中进行

  • 问题内容: 我正在使用JDBC,需要不断检查数据库是否有更改值。 我目前拥有的是无限循环运行,内部循环迭代更改的值以及针对数据库的每次迭代。 我认为这不是最好的方法。 我在想的另一种方法是反向操作,以保持对数据库的迭代。 更新 感谢您提供有关计时器的反馈,但我认为它不能解决我的问题。一旦数据库中发生更改,我需要立即针对更改的值(示例代码中的“ el”)处理结果。 即使数据库没有更改,它仍然必须不断

  • 我想实现一个无限循环数据集 如您所见,这里的主要挑战是方法。如果我在那里放一个足够大的数字,比如1 如果我在那里放一个小数字,比如1或BATCH_SIZE,训练循环中采样的“数据”将定期重复。这不是我想要的,因为我想产生新的数据 我猜过度使用内存的罪魁祸首是堆栈中的某个地方,缓存了一堆东西。随便看看Python的一面,我就不知道在哪里了。 有人能告诉我什么是实现我想要的最好的方法吗?(使用Data

  • 我想构建一个无头应用程序,它将在无限循环中查询数据库,并在某些条件下执行一些操作(例如,获取具有特定值的记录,当发现时,为每个消息启动电子邮件发送过程)。 我想使用Spring Boot作为基础(特别是因为Actuator允许公开健康检查),但现在我使用Spring Boot构建REST Web服务。 在构建无限循环应用程序时,是否有任何最佳实践或模式可遵循?有没有人试图基于Spring Boot