2009-08-01 69 views
3

我想在數據庫中更新一些表,並希望所有這些工作都在1個事務中完成, 首先我刪除branchbuildin(表)中的一些條目並在此操作後插入新的一個 問題當我插入和輸入相同的buildingname和branch_fk(因爲我在這張表上有這個約束(uniqueConstraints = {@ UniqueConstraint(columnNames = {「buildingname」,「branch_fk」})}))但是當我不使用休眠會話和使用正常的JDBC事務我沒有這些問題。休眠事務重複問題

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。

會話會跟蹤它管理的每個實體。即使您要求在數據庫中將其刪除,相應的對象仍會記憶在會話中,直到會話終止。

一般情況下,有可能 休眠它們發送到數據庫時,對 效率的原因,重新安排你的操作 。

你可以做的是沖洗,因爲保存(如果需要的話,你也可以明確 - 即清空由會話記憶的實體 - 沖洗後)(即發送到數據庫。)您的交易:

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

還要注意,儘管您的實體被會話記憶,但修改它們會在關閉會話時觸發自動更新。

在我們的項目中,我們有一個方法可以有效地刪除實體的一個集合(以及另一個用於數組的聲明,使用方便的...參數語法聲明)(它適用於所有實體,它不必爲每個實體),同時消除他們走出了會議,並在服藥前沖洗的護理:對所有實體

  1. 循環,將其刪除(使用sess.delete(e)),並將其添加到「deleteds名單。
  2. 每50個單位(相當於我們配置效率的原因,批量大小)(,並在年底):
    • 沖洗會話來強制Hibernate立即發送更改到數據庫,
    • 環上'已刪除'列表,清除會話中的每個實體(使用sess.evict(e))。
    • 清空'deleteds'列表。

別擔心,沖水只發送SQL數據庫。它仍然需要提交或回滾。

+0

Tanx但如果我會話會話,然後我的連接CUTOFF執行刷新後事務回滾會發生什麼? 我需要在一次事務中完成所有工作(我可以在它們之間使用flush,並且會傷害事務回滾並提交?) – Am1rr3zA 2009-08-01 16:28:41