2009-08-01 11 views
3

データベース内のテーブルの一部を更新し、これらの作業をすべて1トランザクションで実行したい場合は、まず branchbuildin(テーブル)のエントリを削除し、新しいアクションを挿入してください。 問題同じテーブル名とbranch_fkを持つエントリを挿入したときに発生しました(このテーブルにこの制約があります(uniqueConstraints = {@ UniqueConstraint(columnNames = {"buildingname"、 "branch_fk"})})))セッションを休止し、通常のJDBCトランザクションを使用するこれらの問題はありません。Hibernateトランザクションの重複問題

List<Integer> allBranchBuilding = branchBuildingDao.getAllBranchBuildingID(pkId, sess); 
      for (Integer integer : allBranchBuilding) { 
       branchBuildingDao.delete(integer, sess); // delete kardane tamame BranchBuilding ha va tel haie aanha 
      } 

      Address myAdr = new Address(); 
      setAddress(myAdr, centralFlag, city, latit, longit, mainstreet, remainAdr, state); 
      BranchBuildingEntity bbe = new BranchBuildingEntity(); 
      setBranchBuildingEntity(bbe, be, myAdr, city, centralFlag, latit, longit, mainstreet, buildingName, remainAdr, state, des); 
      branchBuildingDao.save(bbe, sess);//Exception Occurred     

私はメソッドの最初で私のセッションを取得:

 Session sess = null; 
     sess = HibernateUtil.getSession(); 
     Transaction tx = sess.beginTransaction(); 

答えて

6

そうだね、すべてが同じトランザクションで発生し、同じHibernateのSession。

セッションは、管理するすべてのエンティティを追跡します。データベースで削除するよう依頼したにもかかわらず、セッションが終了するまで、対応するオブジェクトはセッションに引き続き記憶されます。一般的に

、 効率上の理由から、データベースに送信するとき Hibernateはあなたの操作 を並べ替えることも可能です。 ( - すなわちセッションで記憶の実体を空 - 必要であれば、あなたも明確にできてフラッシュした後)保存するので、あなたは何ができるか

は、あなたの取引(すなわちデータベースに送信)フラッシュです:

sess.flush(); 
// sess.clear(); // if needed or convenient for you 
branchBuildingDao.save(bbe, sess); 

エンティティがセッションによって暗記されている間に、そのエンティティを変更すると、セッションを閉じるときに自動的に更新が行われることにも注意してください。

私たちのプロジェクトでは、エンティティのコレクション(および便利な...パラメータ構文で宣言された配列)を効率的に削除するメソッドがあります(すべてのエンティティで機能しますが、同時にセッションからそれらを除去し、前洗浄の世話をして、各エンティティ)、:

  1. ループがすべてのエンティティには、()sess.delete(e)を使用して、それを削除し、「deleteds」リストに追加します。
  2. 毎週50個のエンティティ(我々は、効率の理由のために構成バッチサイズに対応する)(および終了時)に
    • フラッシュ直ちに変更をデータベースに送信するために休止状態を強制的にセッション、
    • ループ'deleteds'リストは、セッションの各エンティティをクリアします(sess.evict(e)を使用)。
    • 「deleteds」リストを空にします。

、唯一のデータベースにSQLを送信フラッシュ心配しないでください。コミットまたはロールバックの対象となります。

+0

Tanxしかし、私はセッションを洗練し、その後、私の接続CUTOFFは、フラッシュ後にトランザクションのロールバックを行いますか? 私はすべての仕事を1つのトランザクションで行う必要があります(それらの間をフラッシュしてトランザクションのロールバックやコミットを傷つけることはできますか?) – Am1rr3zA

+0

KLEが正しい(以前に削除されたエンティティでは 'evict()'を呼び出すことを除いて、手元には問題はないが問題はない)。 "flush"はセッション状態をデータベースと同期させる単なるプロセスである。必要な挿入/更新/削除ステートメントをデータベースに発行します。トランザクションがコミットされていない限り、同じステートメントを手動で発行するのと変わらないトランザクションに関しては、すべてのステートメントはロールバックされます(明示的なロールバック、接続の切断、サーバーの停止、 – ChssPly76

+0

@ ChssPly76こんにちは。私はあなたの「エビクト」のコメントに興味があります。問題を拡大できますか? – KLE

関連する問題