2013-02-15 41 views
6

我有很多顧客與BusinessUnit之間有許多關係:JPA多對多合併的所有者觸發刪除連接表

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; 

} 

當我打電話entityManager.merge(客戶);對客戶(已在DB,沒有改變),我看到日誌這兩個SQL命令:

休眠:更新的客戶設置CUS_DESCR = ?, CUS_NAME = ?, CUS_ENABLED =? 其中CUS_ID =?休眠:從CUS_BUS_UNITS刪除CUS_ID =?

爲什麼hibernate試圖從連接表中刪除記錄? 我只需要更新客戶記錄和連接表中的可能記錄 - 取決於我是否在客戶上添加或刪除了業務單位。業務單位不應該更新,刪除或插入。

編輯: 我等號/的hashCode是(在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; 
} 

編輯2 轉換爲以下形式:

@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

做客戶和業務單位都有正確的哈希碼和等於方法? – 2013-02-15 14:50:59

+0

我刪除了它 - 但他們有抽象的父母與那些使用實體ID爲equals/hashcode的方法。 – DominikM 2013-02-15 14:56:35

+0

當添加一個新的'BusinessUnit' hibernate設置id時,這會改變對象的「身份」,使用「equals」實現,這可能會導致混淆。你可以嘗試沒有'equals'和'hashCode',看看問題是否仍然存在? – 2013-02-15 23:07:58

回答