1

jpa と hibernate で厄介なバグに遭遇しました。次の注釈が付いた課金クラスがあります。

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="ch1_id", referencedColumnName="id")
private List<BillingItem>billingItems = new ArrayList<BillingItem>();

コレクションから削除されたアイテムをフィルタリングする必要がありますが、jpa 以外は使用できません。休止状態固有の注釈は許可されていません。だから私はロード後の関数を書きました:

@PostLoad
public void postLoad() {
    ArrayList<BillingItem>tempItems = new ArrayList<BillingItem>();

    Iterator<BillingItem> i = this.billingItems.iterator();
    BillingItem item;
    while(i.hasNext()) {
        item = i.next();            
        if( item.getStatus().equals("D")) {
            tempItems.add(item);                
        }                       
    }

    this.billingItems.removeAll(tempItems);
}

ただし、フィルターする削除済みアイテムがある場合は、

Hibernate: billing_on_item set ch1_id=null を更新します。ch1_id=? そしてid=?

ch1_id は外部キーであり、null にすることはできないため、例外が発生します。ただし、休止状態はパラメーターを正しい値にバインドしています。そもそもなぜこの更新が行われるのですか? エラーを修正するにはどうすればよいですか?

前もって感謝します、

ランディ

4

2 に答える 2

4

コレクションからアイテムを削除することで、Hibernate に 2 つのエンティティ間の関連付けがもう存在しないことを伝えているため、明らかに、Hibernate はデータベースでこの関連付けを具体化するものを削除します。つまり、外部キーを null に設定します。

おそらく必要なのは、削除されていないアイテムのみを返すエンティティ内のゲッターです。

public List<BillingItem> getNonDeletedItems() {
    List<BillingItem> result = new ArrayList<BillingItem>();
    for (BillingItem item : this.billingItems) {
        if (!"D".equals(item.getStatus()) {
            result.add(item);
        }
    }
    return result;
}
于 2012-05-03T17:12:01.830 に答える
0

この@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)行は、すべての更新をカスケードすることを示しています。CascadeTypeを調べます。

于 2012-05-03T17:13:04.997 に答える