Customer と BusinessUnit の間に多対多の関係があります。
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(customer); を呼び出すと、顧客(すでにDBにあり、変更されていません)で、ログに次の2つのSQLコマンドが表示されます。
Hibernate: CUSTOMERS set CUS_DESCR=?, CUS_NAME=?, CUS_ENABLED=? を更新します。CUS_ID=? Hibernate: CUS_BUS_UNITS から削除します。CUS_ID=?
休止状態が結合テーブルからレコードを削除しようとするのはなぜですか? 顧客レコードと、場合によっては結合テーブルのレコードを更新するだけで済みます - 顧客のビジネス ユニットを追加または削除したかどうかによって異なります。ビジネス ユニットを更新、削除、または挿入しないでください。
編集: 私のequals/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;
}
}