2011-10-28 2 views
4

大規模なHibernateトランザクション中に単一のエンティティをDBにフラッシュする必要があります。休止状態のセッションで単一のエンティティをフラッシュする方法

トランザクションに添付されているエンティティの一部が矛盾していて、まだDBにフラッシュできないため、トランザクションをコミットしたくないのですが、トランザクションの後半でこのエンティティトランザクションを検証する集約クエリに含まれています。

同じテーブルから選択された合計(数量)を後で(同じトランザクションで)DBに保存する必要がある数量明細があります。結果の数量は、全体の特定の基準と一致する必要がありますトランザクションは有効です。

数量が保存されていない場合、合計(数量)が間違った値を返しますが、保存されている場合は合計が正しくなり、残りのトランザクション処理は完了します。

実際に多数の広告申込情報がすべて異なる場所にあり、合計が呼び出される場所が異なるモジュールにあるため、広告申込情報の数量を合計結果に「追加する」こともできませんアイテムが追加されます。

現在のトランザクション内でDBに1行の項目をフラッシュ(SQL挿入)できれば、システムは正常に動作します。

詳細は:

私はSQL Serverでこの問題を取得しますが、Oracleには行わないことを発見しました。これは厄介でした..

私はそれを捜しました。そして、あなたが "saveOrUpdate"を呼び出すと、Hibernateの内部では、エンティティの@ Idがどのように生成されているかを見ています。

SQL ServerにはID列があり、エンティティがそのIDを取得する唯一の方法は挿入されます(したがって、私が望むものです).Oracleでは、Identitiesをサポートしないため、シーケンスを使用します各列のIDを生成します。

IDを生成するためにレコードを挿入する必要がないため、エンティティが挿入されていないことがSQL Server上にあることを意味します。

まとめだから、Hibernateは、選択的挿入をサポートしているようだが、それはする必要があるときに、これまでそれは今だけ私はそれを強制することができる方法があるかどうか確認する必要があり、挿入されます。

答えて

2

私はあなたがこれを行うことができるとは思わない、それは私が知っている限り "すべてか何か"です。代わりに、dbに保存されている現在の合計(数量)を取得してから、それに保存する追加量を追加してから、検証を実行できますか?

+0

私はあなたが正しいと思いますが、Idが必要な場合は、Hibernateがこれらのレコードを選択的に挿入するので面白いです。内部的にサポートするレベルがあるので、自分でアクセスするのはいいです。 – stevemac