隨筆-7  評論-24  文章-102  trackbacks-0


          預備知識:出自:hibernate的各種保存方式的區別 (save,persis,update,saveOrUpdte,merge等)
          在所有之前,說明一下,對于hibernate,它的對象有三種狀態,transient、persistent、detached
              transient:瞬態或者自由態
              persistent:持久化狀態
              detached:脫管狀態或者游離態
          脫管狀態的實例可以通過調用save()、persist()或者saveOrUpdate()方法進行持久化。
          持久化實例可以通過調用 delete()變成脫管狀態。通過get()或load()方法得到的實例都是持久化狀態的。
          脫管狀態的實例可以通過調用 update()、0saveOrUpdate()、lock()或者replicate()進行持久化。

          save()和persist()將會引發SQL的INSERT,delete()會引發SQLDELETE,
          而update()或merge()會引發SQLUPDATE。對持久化(persistent)實例的修改在刷新提交的時候會被檢測到,
          它也會引起SQLUPDATE。saveOrUpdate()或者replicate()會引發SQLINSERT或者UPDATE


          [推薦] 解析eclipse下生成Hibernate DAO中的幾個方法出自: http://blog.csdn.net/xzknet/archive/2007/06/06/1641204.aspx
          void save(Usertable transientInstance)
               方法提供了向數據庫中添加數據的功能
          void delete(Usertable persistentInstance) 
               方法看名知意是用來刪除的.
          Usertable findById(java.lang.Integer id)
               方法實現了按ID查詢數據.
          List findByExample(Usertable instance) 
               方法實現的功能相當于"select * from Usertable"實現的功能就是查詢所有
          List findByProperty(String propertyName, Object value) 
               方法用來靈活的提供一種按條件查詢的方法,你可以自己定義要按什么樣的方式查詢.


          CodeDepts merge(CodeDepts detachedInstance) 
               將傳入的detached狀態的對象的屬性復制到持久化對象中,并返回該持久化對象。如果該session中沒有關聯的持久化對象,加載一個,如果傳入對象未保存,保存一個副本并作為持久對象返回,傳入對象依然保持detached狀態。
          void attachDirty(CodeDepts instance)
               將傳入的對象持久化并保存。如果對象未保存(Transient狀態),調用save方法保存。如果對象已保存(Detached狀態),調用update方法將對象與Session重新關聯。
          attachClean(CodeDepts instance)
               將傳入的對象狀態設置為Transient狀態。



          .merge(object)  合并、吞入hibernate的各種保存方式的區別 (save,persis,update,saveOrUpdte,merge等)
          如果session中存在相同持久化標識(identifier)的實例,用用戶給出的對象的狀態覆蓋舊有的持久實例
          如果session沒有相應的持久實例,則嘗試從數據庫中加載,或創建新的持久化實例,最后返回該持久實例
          用戶給出的這個對象沒有被關聯到session上,它依舊是脫管的
          重點是最后一句:
              當我們使用update的時候,執行完成后,我們提供的對象A的狀態變成持久化狀態。
              但當我們使用merge的時候,執行完成,我們提供的對象A還是脫管狀態,hibernate或者new了一個B,或者檢索到一個持久對象B,并把我們提供的對象A的所有的值拷貝到這個B,執行完成后B是持久狀態,而我們提供的A還是托管狀態


          NonUniqueObjectException問題的解決
          org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
          解決方法:
               使用 hibernate 3 的 merge 方法. session.merge(newDetail)即可,它會在 session 緩存中找到持久化對象,把新對象的屬性賦過去,再保存原session中的持久化對象。
               如果在session或數據庫中沒有的對象,用merge方法的話,它也能夠幫你把記錄 insert 到表中,相當于 save 方法。


           
          .findByExample(object)使用Spring封裝的Hibernate方法
          按照 object 所設置的屬性值來組合查詢語句的where條件,比如:
              Users anUser = new Users();
              anUser.setUserName("a");
              anUser.setPassWord("b"); 
                                     =====> where username='a' and password='b'
              anUser.setRealName("");
                                     =====> where username='a' and password='b' and realname=''
          posted on 2008-09-05 23:11 黃小二 閱讀(733) 評論(0)  編輯  收藏 所屬分類: S/S2SH
          主站蜘蛛池模板: 海兴县| 绵竹市| 玉田县| 宝坻区| 嵊泗县| 启东市| 介休市| 花莲市| 天柱县| 连江县| 商南县| 宁津县| 台中市| 东安县| 滦南县| 吉水县| 津南区| 永嘉县| 治县。| 习水县| 乌什县| 黄大仙区| 柘荣县| 泰和县| 社旗县| 潼关县| 吉隆县| 临江市| 磐石市| 丰台区| 吴忠市| 庆城县| 广元市| 民县| 溧阳市| 车险| 桂平市| 双城市| 惠水县| 柳林县| 措美县|