2012-05-03 10 views
0

jpaとhibernateで厄介なバグが発生しました。私は、次の注釈付きの課金クラスを持っている:オブジェクトがコレクションから削除されたときに1つ以上のコレクションを更新するHibernate

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

は今、私がコレクションから削除されたアイテムをフィルタリングする必要がありますが、JPA以外のものを使用することはできません。特定の休止状態の特定のアノテーションは許可されません。だから私は、ポストロード機能を書いた:更新billing_on_itemセットch1_id = nullのch1_id =:

@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を見ていますか?とid =?

例外は、ch1_idが外部キーであり、nullにできないために発生します。しかし、休止状態は、パラメータを正しい値にバインドしています。なぜこのアップデートは最初に起こっていますか?エラーを修正するにはどうすればよいですか?事前に

おかげで、

ランディ

答えて

4

コレクションから項目を除去することにより、あなたは2つのエンティティ間の関連性が非常に明らかに、もはや存在しないことにHibernateを言っている、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; 
} 
+0

ありがとうございました!私はこのようなシンプルで洗練されたソリューションを考えたことはありませんでした。意味をなさない – randy

0

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)ラインは、それがすべての更新をカスケードすることを述べている:あなたはおそらく欲しい

はただ唯一の非削除済みアイテムを返すエンティティでゲッターです。 CascadeTypeをご覧ください。

関連する問題