2011-06-15 17 views
2

私はエンティティを持っています。それをXとしましょう(エンティティは@Id idを持ちます)。 エンティティはテーブルにマップされています。それをX_TABLEとしましょう。 また、私は次のコードで働いているテーブルがHibernateのネイティブクエリによって時々更新されない

@ManyToOne 
@JoinColumn(name = "JOIN_COLUMN") 
YClass joinColumn;//another entity 

含まれています、

X x = new X(xDTO);//just a copy constructor, nothing fancy, without id 
x.joinColumn = null; 
entityManager.persit(x); 
entityManager.flush(); 
join_column_id = somne_function();//irelevant 
Query q = entityManager.createNativeQuery(
     "UPDATE X_TABLE t SET t.JOIN_COLUMN=" + join_column_id + " WHERE " + " t.id= " + x.getId()); 
q.executeUpdate(); 
q.flush(); 

これを行うことでポイントをする場合には、誰もが疑問に思っている、join_columnは別のテーブルへの外部キーであることです他のデータベースでは、対応するテーブルがX_TABLEを含む同じデータベースに存在しないため、ネイティブクエリで設定しています。しかし、これは問題ではありません。 enitityマッピングと関係はすべていいです、私はそれを保証することができます。

上記のコードは、ループ内のいくつかのレコードに対して実行され、すべてのレコードに対して細かい動作(テーブルの保存と更新)を行うことがあります。しかし、ループ内の最後のレコード(レコードを保存するという意味で、がデータベース内の更新を実行しないという意味)を除くすべてのレコードで正常に動作することがあります。 例外がスローされたがあり、JBossサーバーのデバッグログ(hibernate用)は、正しい値でUPDATEがエラーなしで行われていることを示しています。しかし、テーブルにはJOIN_COLUMNに1つのレコードだけのnullが含まれています。なぜ私は理想的な理由がありません。何かご意見は?

PS:サービスはコンテナ管理トランザクションです。

答えて

0

いくつかの提案:

  • のexecuteUpdate(によって影響を受ける行の数を確認してください)
  • あなたのトランザクションポリシーとは何ですか?定義されているTransactionManager?
関連する問題