2012-09-24 31 views
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"); 
      } 
     } 
+0

OrderItem是否需要知道它包含的訂單?假設它確實 - 它屬於一個訂單或另一個訂單的事實改變了它的性質(即,如果它們具有相同的ID,不管包含順序如何,您是否可以說2個訂單項是相等的)? – assylias

+0

如果我們使用JPA onetomany雙向,我們需要知道 – CycDemo

回答

0

我將它改寫爲只使用id平等檢查屬性。但是,這是重要:如果您希望您的實體在Java集合中正確行爲,請不要忘記也覆蓋hashcode()方法。