7

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;
    }

}
4

1 に答える 1

3

私は答えを見つけました: http://assarconsulting.blogspot.fr/2009/08/why-hibernate-does-delete-all-then-re.html

Collection を使用しているため、この動作は正しいです (リンクされた記事を参照)。コレクションの代わりに Set を使用しましたが、正常に動作します。

于 2013-02-18T11:45:16.807 に答える