在下面的Java代码中获取StackOverflowError

时间:2019-06-23 06:22:48

标签: java jpa lombok

我正在尝试在表上实现软删除,下面是我为实现相同目的而执行的代码

@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的影响有关。

1 个答案:

答案 0 :(得分:3)

Lombok @Data为您生成toString,您可能在Product类中使用了双向关联。可能Product也已覆盖toString方法。由于这种双向关联,您只是在toString调用中陷入无限循环。

lealceldeiro建议的一种解决方案是在生成User方法时不考虑您的toString类中的product字段。您可以通过使用@ToString.Exclude lombok注释来注释字段来实现此目的:

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

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

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