我不明白为什么我对 Lombok 的 toString 有问题

I don't understand why i have a problem with toString of Lombok

我的问题是关于 @ToString 的龙目岛。 我不明白为什么会出现此错误:

java.lang.WhosebugError
    at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:120)
    at com.protypangel.market_selling.entity.market.shopping.ShoppingCart.hashCode(ShoppingCart.java:11)
    at com.protypangel.market_selling.entity.market.shopping.CartItem.hashCode(CartItem.java:9)
    at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124)
    at com.protypangel.market_selling.entity.market.shopping.ShoppingCart.hashCode(ShoppingCart.java:11)
    at com.protypangel.market_selling.entity.market.shopping.CartItem.hashCode(CartItem.java:9)
    at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124)
    at com.protypangel.market_selling.entity.market.shopping.ShoppingCart.hashCode(ShoppingCart.java:11)
    at com.protypangel.market_selling.entity.market.shopping.CartItem.hashCode(CartItem.java:9)

当我排除 CartItemShoppingCart 的读数 属性 时。

这不是简单地取消循环吗?

在我心中:

ShoppingCart => CartItem =x=> ShoppingCart (great)
ShoppingCart => CartItem => ShoppingCart => ... (bad)
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ShoppingCart {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
    @ToString.Exclude @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @OneToOne(fetch = FetchType.EAGER) Client client;
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "shoppingCart") Set<CartItem> items;
}
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class CartItem {
    @Id private String id;
    @ToString.Exclude @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @ManyToOne(fetch = FetchType.EAGER) ShoppingCart shoppingCart;
    private String productReference;
    @PrePersist void setId() {
        this.id = new StringBuilder(shoppingCart.getId().toString()).append("+").append(productReference).toString();
    }
}

您正在尝试打印具有连接的模型 class。因此,在获取所需的 table 数据时,也会获取其他加入的 table 数据。这导致堆栈溢出错误。您可以使用 DTO classes 打印属性。

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ShoppingCartDTO {
     private Long id;
     Client client;
     Set<CartItem> items;
     public ShoppingCartDTO(ShoppingCart shoppingCart)
    {
       //setters here
     }
}

也为 cartItem 创建 DTO。