【问题标题】:getting the StackOverflowError in below piece of java code在下面的一段 java 代码中获取 StackOverflowError
【发布时间】:2019-11-05 08:57:42
【问题描述】:

我正在尝试在表上实现软删除,下面是我为实现相同功能所做的代码

@Entity
@Data
@Table(name = "users")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String surname;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Product> products = new ArrayList<>();

}

我在调试时遇到以下异常

Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.test.User.toString()

请告知这与我在实体中使用的龙目岛的影响有关。

【问题讨论】:

  • lombok Data 为您生成 toString 并且您可能正在您的 SubDomain 类中使用双向关联。并且可能 SubDomain 也覆盖了 toString 方法。由于我猜这种双向关联,您只是得到了toString 调用的无限循环。显示您的 SubDomain 课程。
  • @michalk 是对的,我以前见过这个。如果可能,请尝试从 toString 一代中排除 subDomains
  • @lealceldeiro 感谢您的快速建议,请您也请交叉检查我的上表设计,特别是对于列 is_active
  • 您可能应该为您的其他问题打开另一个单独的帖子(关于lombok 在实体和数据库表中的影响),但我认为没有必要。据我所知,lombok 与持久层无关。它所做的只是为您创建一堆构建器(getter、setter、toString 等)。这些都不会影响持久层。但是,在这方面一丝不苟并分析您的项目并从整体背景的大局中分析您的项目总是很理智的。
  • “下面是代码”在哪里?。

标签: java jpa lombok


【解决方案1】:

Lombok @Data 为您生成 toString,您可能在 Product 类中使用了双向关联。并且可能Product 也覆盖了toString 方法。由于我猜这种双向关联,您只是得到了toString 调用的无限循环。

lealceldeiro 建议的一个解决方案是在 toString 方法生成中排除 User 类中的 products 字段。您可以通过使用@ToString.Exclude lombok 注释来注释您的字段来实现这一点:

@ToString.Exclude
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Product> products = new ArrayList<>();

或者您可以排除 Product 实体中的 user 字段。

您可以在他们的官方网站上阅读有关 lombok @ToString 的信息。

【讨论】:

  • @ToString 的链接可能对 OP 有所帮助,以防她/他想详细阅读此内容。
  • @michalk Thaks 是的,它有效,请您也请交叉检查我在上面编辑过的表格设计
  • 在不了解上下文的情况下很难对设计进行推理。对我来说,它看起来不错。但是,在 StackOverflow 上,如果一个问题已得到解答,则当问题与问题没有直接关系时,您不应在问题中添加其他方面。你应该发布另一个关于它的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多