我不明白为什么我对 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)
当我排除 CartItem
中 ShoppingCart
的读数 属性 时。
这不是简单地取消循环吗?
在我心中:
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。
我的问题是关于 @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)
当我排除 CartItem
中 ShoppingCart
的读数 属性 时。
这不是简单地取消循环吗?
在我心中:
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。