2

私のドメインモデルには、多くの双方向の関連付けがあります(OneToManyとManyToManyの両方)

私はこの記事を読み、サンプルパターンに基づいてすべての関連付けを行いました。(ManyToManyアソシエーションには、パターンに従って、両面addXYメソッドがあります)

この記事のパターンを使用すると、質問は、逆側から削除するのはどうですか?

例:

public class Customer implements Serializable {

...

@ManyToOne()
private CustomerStatus customerStatus;


@PreRemove
public void preRemove(){
    setCustomerStatus(null);
}

public void setCustomerStatus(CustomerStatus customerStatus) {
    if(this.customerStatus != null) { this.customerStatus.internalRemoveCustomer(this); }
    this.customerStatus = customerStatus;
    if(customerStatus != null) { customerStatus.internalAddCustomer(this); }
}

反対側:

public class CustomerStatus implements Serializable {

private static final long serialVersionUID = 1L;

@OneToMany(mappedBy="customerStatus")
private List<Customer> customers;

@PreRemove
public void preRemove(){
    for(Customer c : customers){
        c.setCustomerStatus(null); // this causes ConcurrentException
    }

}

public List<Customer> getCustomers() {
    return Collections.unmodifiableList(this.customers);
}

public void addCustomer(Customer c){
    c.setCustomerStatus(this);
}

public void removeCustomer(Customer c){
    c.setCustomerStatus(null);
}

void internalAddCustomer(Customer c){
    this.customers.add(c);
}

void internalRemoveCustomer(Customer c){
    this.customers.remove(c);
}

問題は、preRemoveメソッドが原因となることConcurrentExceptionです。これをどのように処理しますか?目標は、CustomerStatusを削除し、そのステータスがあったすべての顧客をNULLに設定することです。

アップデート

preRemoveメソッドがなければ、私はMySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails

4

1 に答える 1

2

顧客コレクションを反復処理している間は、this.customers.remove(c)を呼び出すことはできません。この質問は以前に出てきたので、ここにあるような他の解決策を見つけることができます: マップを反復処理して値を変更するときにConcurrentModificationExceptionを回避する方法は?

しかし、簡単な解決策は、古いものから新しいリストを作成して、preRemoveを繰り返すことです。

public void preRemove(){
    List<Customer> tempList = new ArrayList(customers);
    for(Customer c : tempList){
        c.setCustomerStatus(null); 
    }
}
于 2012-12-03T20:20:27.830 に答える