在下面的java代码中获取StackOverflowError

sds*_*wwq 3 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<>();

}
Run Code Online (Sandbox Code Playgroud)

我在调试时遇到以下异常

Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.test.User.toString()
Run Code Online (Sandbox Code Playgroud)

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

mic*_*alk 5

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

lealceldeiro 建议的一种解决方案是将类中的 products 字段排除User在方法生成的考虑范围之外toString。您可以通过使用@ToString.Excludelombok 注释来注释您的字段来实现此目的:

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

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

您可以在其官方网站上了解有关 lombok 的信息@ToString