【问题标题】:Is it possible to avoid recursion and StackOverflowError in OneToMany-ManyToOne bi-directional relations?是否可以避免 OneToMany-ManyToOne 双向关系中的递归和 StackOverflowError?
【发布时间】:2020-09-27 14:10:10
【问题描述】:

我使用 Spring Boot 和 Thymeleaf 创建一个 Web 应用程序。

当我调试我的应用程序时,它的运行速度非常慢。每个 F8 步骤,调试器都会在我的对象上显示消息 "Collecting data..."。而且我很长一段时间(10-60 秒)都看不到我的对象的状态。

最后,当收集数据完成时,我看到 StackOverflowError

我知道在这种情况下存在无限递归。汽车链接到服务,服务链接到汽车,等等。它会溢出每个对象的toString() 方法。

我看到很多使用@OneToMany@ManyToOne 注释的例子。所有这些都会导致这种递归和 StackOverflowError。在这种情况下,工程师建议使用@JsonIgnore@JsonManagedReference/@JsonBackReference 注解来修复无限递归。

这些建议适用于 REST API 序列化对象。

问题在于我没有开发 REST API。我制作 Web MVC 应用程序

那么你能推荐我什么来修复这个递归并拥有一个快速调试的应用程序?

这是一个糟糕的设计吗?还是别的什么?

谢谢

【问题讨论】:

    标签: spring-boot debugging recursion one-to-many many-to-one


    【解决方案1】:

    我在调试过程中没有遇到此类问题,我认为这与您的设计有关。 但是尝试添加 LAZY,例如:

    @ManyToOne(fetch = FetchType.LAZY)
    

    这会有所帮助。

    【讨论】:

    • 您的回答很有用。它在一定程度上有助于解决调试期间的性能问题。谢谢
    【解决方案2】:

    问题的有效解决方案:

    1. 首先需要标记@ManyToOne(fetch = FetchType.LAZY)注解,以便在调试时有更好的性能。

    2. 必须做的第二件事是修改标准 IDE 生成的toString 方法。对于嵌套对象,您不应返回整个对象,而应仅返回一个对象 ID。

    Service 的示例:

    修改前:

    @Override
      public String toString() {
        return "Service{" +
            "serviceId=" + serviceId +
            ", car=" + car +
            ", event='" + event + '\'' +
            ", created=" + created +
            ", modified=" + modified +
            '}';
      }
    

    修改后:

    @Override
      public String toString() {
        String carId;
        if (car == null) {
          carId = "null";
        } else {
          carId = car.getCarId().toString();
        }
        return "Service{" +
            "serviceId=" + serviceId +
            ", carId=" + carId +
            ", event='" + event + '\'' +
            ", created=" + created +
            ", modified=" + modified +
            '}';
      }
    

    现在我没有收到调试器 "Collecting data..." 消息和 StackOverflowError 异常。

    调试性能不错!

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多