0
當檢查實例與其他實例相同時,我得到重寫等於方法和雙向關係
java.lang.StackOverflowError
。
由於存在雙向關係,所以我的Override equal method
調用equal()
遞歸地相互作用。 我是否應該在一側的override equal method
中刪除一個檢查平等條件? 什麼會更好?一些PG建議我使用Apache的EqualsBuilder
。
OrderItem.java
public class OrderItem {
private String id;
private Order order;
public OrderItem(String id, Order order) {
this.id = id;
this.order = order;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setOrder(Order order) {
this.order = order;
}
public Order getOrder() {
return order;
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (!(object instanceof OrderItem)) {
return false;
}
final OrderItem other = (OrderItem)object;
if (!(id == null ? other.id == null : id.equals(other.id))) {
return false;
}
if (!(order == null ? other.order == null : order.equals(other.order))) {
return false;
}
return true;
}
}
Order.java
public class Order {
private String id;
private List<OrderItem> orderItemList;
public Order(String id) {
this.id = id;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setOrderItemList(List<OrderItem> orderItemList) {
this.orderItemList = orderItemList;
}
public List<OrderItem> getOrderItemList() {
return orderItemList;
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (!(object instanceof Order)) {
return false;
}
final Order other = (Order)object;
if (!(id == null ? other.id == null : id.equals(other.id))) {
return false;
}
if (!(orderItemList == null ? other.orderItemList == null : orderItemList.equals(other.orderItemList))) {
return false;
}
return true;
}
}
測試
public static void main(String[] args) {
Order order1 = new Order("1");
List<OrderItem> orderItemList = new ArrayList<OrderItem>();
orderItemList.add(new OrderItem("1", order1));
orderItemList.add(new OrderItem("2", order1));
order1.setOrderItemList(orderItemList);
Order order2 = new Order("1");
List<OrderItem> orderItemList2 = new ArrayList<OrderItem>();
orderItemList2.add(new OrderItem("1", order2));
orderItemList2.add(new OrderItem("2", order2));
order2.setOrderItemList(orderItemList2);
if(order1.equals(order2)) {
System.out.println("Equal");
} else {
System.out.println("Not Equal");
}
}
OrderItem是否需要知道它包含的訂單?假設它確實 - 它屬於一個訂單或另一個訂單的事實改變了它的性質(即,如果它們具有相同的ID,不管包含順序如何,您是否可以說2個訂單項是相等的)? – assylias
如果我們使用JPA onetomany雙向,我們需要知道 – CycDemo