2013-02-15 27 views
6

Tôi có rất nhiều đối với nhiều mối quan hệ giữa khách hàng và BusinessUnit:JPA nhiều nhiều hợp nhất về chủ sở hữu gây nên xóa trên tham gia bảng

public class Customer extends AbstractEntity { 

    @JoinTable(name = "CUS_BUS_UNITS", 
      joinColumns = { 
       @JoinColumn(name = "CUS_ID", referencedColumnName = "CUS_ID")}, 
      inverseJoinColumns = { 
       @JoinColumn(name = "BUS_ID", referencedColumnName = "BUS_ID")}) 
    @ManyToMany 
    private Collection<BusinessUnit> businessUnits; 
} 

public class BusinessUnit extends AbstractEntity { 

    @ManyToMany(mappedBy = "businessUnits") 
    private Collection<Customer> customers; 

} 

Khi tôi gọi entityManager.merge (khách hàng); trên một khách hàng (đã có trong DB, không bị thay đổi) tôi thấy hai lệnh sql này trong nhật ký:

Hibernate: update CUSTOMERS set CUS_DESCR = ?, CUS_NAME = ?, CUS_ENABLED =? nơi CUS_ID =? Hibernate: xóa khỏi CUS_BUS_UNITS trong đó CUS_ID =?

Tại sao hibernate cố gắng xóa bản ghi khỏi bảng tham gia? Tôi chỉ cần cập nhật hồ sơ khách hàng và có thể các bản ghi trong bảng tham gia - phụ thuộc vào việc tôi đã thêm hoặc xóa các đơn vị kinh doanh trên khách hàng hay chưa. Không nên cập nhật, xóa hoặc chèn các đơn vị kinh doanh.

EDIT: bình đẳng của tôi/hashCode được (quy định tại AbstractEntity):

public int hashCode() { 
    if (getId() != null) { 
     return getId().hashCode(); 
    } 
    return super.hashCode(); 
} 
public boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    AbstractEntity other = (AbstractEntity) obj; 
    if (getId() == null || other.getId() == null) { 
     return false; 
    } 
    if (!getId().equals(other.getId())) { 
     return false; 
    } 
    return true; 
} 

EDIT 2 Chuyển đổi đối với hình thức:

@FacesConverter("businessUnitConverter") 
public class BusinessUnitConverter implements Converter { 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object object) { 
     return ((BusinessUnit) object).getId().toString(); 
    } 


    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     BusinessUnit businessUnit = new BusinessUnit(); 
     businessUnit.setId(Long.parseLong(value)); 
     return businessUnit; 
    } 

} 
+0

Khách hàng và doanh nghiệpKhông phải cả hai đều có phương thức băm và bằng đúng? –

+0

Tôi đã xóa nó cho SO - nhưng họ có cha mẹ trừu tượng với những phương pháp sử dụng id thực thể cho bằng/hashcode. – DominikM

+0

Khi thêm một 'BusinessUnit' hibernate mới đặt id và điều này thay đổi" danh tính "của đối tượng với việc thực thi' equals' của bạn, điều này có thể gây nhầm lẫn. Bạn có thể thử mà không có 'equals' và' hashCode' và xem vấn đề vẫn còn tồn tại? –

Trả lời

Các vấn đề liên quan