【发布时间】:2021-05-30 03:41:40
【问题描述】:
我的问题是关于龙目岛的@ToString。
我不明白为什么我有这个错误:
java.lang.StackOverflowError
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();
}
}
【问题讨论】:
-
似乎
CartItem的hashCode也试图调用ShoppingCart的hashCode,这会导致您描述的确切问题,除了hashCode而不是toString。我不知道龙目岛的细节,但似乎你必须从equals/hashCode计算中排除shoppingCart属性以打破循环。