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;
}
}
做客戶和業務單位都有正確的哈希碼和等於方法? – 2013-02-15 14:50:59
我刪除了它 - 但他們有抽象的父母與那些使用實體ID爲equals/hashcode的方法。 – DominikM 2013-02-15 14:56:35
當添加一個新的'BusinessUnit' hibernate設置id時,這會改變對象的「身份」,使用「equals」實現,這可能會導致混淆。你可以嘗試沒有'equals'和'hashCode',看看問題是否仍然存在? – 2013-02-15 23:07:58