Tin's Blog

          You are coming a long way, baby~Thinking, feeling, memory...

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 221 評(píng)論 :: 0 Trackbacks
          Hibernate的透明持久化用起來非常舒服,有時(shí)甚至忘記了數(shù)據(jù)庫(kù)的存在。我身邊的朋友經(jīng)常會(huì)分不清save、saveOrUpdate、update的區(qū)別,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且關(guān)于實(shí)體對(duì)象的生命周期也有很多概念不清,分不清transient、persistent、detached的區(qū)別,只是知道PO、VO這樣的通俗叫法。其實(shí)這些概念都很簡(jiǎn)單,Hibernate的javadoc寫的都很清楚,只需看看就能明白。所以我花了些時(shí)間將Hibernate 3.1.2中session的javadoc部分翻譯了一下,旨在讓那些因?yàn)镠ibernate的“透明”而忘記了它基本概念的人們停下來再看看這些概念


          org.hibernate
          Interface Session

          All Superinterfaces:
          Serializable
          All Known Subinterfaces:
          EventSource, Session
          All Known Implementing Classes:
          SessionImpl

          public interface Session
          extends Serializable

          Java應(yīng)用程序與Hibernate之間的主要運(yùn)行時(shí)接口。它是抽象了持久化服務(wù)概念的核心抽象API類。

          Session的生命周期綁定在一個(gè)物理的事務(wù)(tansaction)上面。(長(zhǎng)的事務(wù)可能跨越多個(gè)數(shù)據(jù)庫(kù)事物。)

          Session的主要功能是提供對(duì)映射的實(shí)體類實(shí)例的創(chuàng)建,讀取和刪除操作。實(shí)例可能以下面三種狀態(tài)存在:

          自由狀態(tài)(transient): 不曾進(jìn)行持久化,未與任何Session相關(guān)聯(lián)
          持久化狀態(tài)(persistent): 僅與一個(gè)Session相關(guān)聯(lián)
          游離狀態(tài)(detached): 已經(jīng)進(jìn)行過持久化,但當(dāng)前未與任何Session相關(guān)聯(lián)

          游離狀態(tài)的實(shí)例可以通過調(diào)用save()persist()或者saveOrUpdate()方法進(jìn)行持久化。持久化實(shí)例可以通過調(diào)用 delete()變成游離狀態(tài)。通過get()load()方法得到的實(shí)例都是持久化狀態(tài)的。游離狀態(tài)的實(shí)例可以通過調(diào)用 update()、0saveOrUpdate()lock()或者replicate()進(jìn)行持久化。游離或者自由狀態(tài)下的實(shí)例可以通過調(diào)用merge()方法成為一個(gè)新的持久化實(shí)例。

          save()persist()將會(huì)引發(fā)SQL的INSERTdelete()會(huì)引發(fā)SQLDELETE,而update()merge()會(huì)引發(fā)SQLUPDATE。對(duì)持久化(persistent)實(shí)例的修改在刷新提交的時(shí)候會(huì)被檢測(cè)到,它也會(huì)引起SQLUPDATEsaveOrUpdate()或者replicate()會(huì)引發(fā)SQLINSERT或者UPDATE

          其具體實(shí)現(xiàn)并不一定是線程安全的。每個(gè)線程/事務(wù)應(yīng)該從一個(gè)SessionFactory獲取自己的session實(shí)例。

          如果其持久化對(duì)象類是可序列化的,則Session實(shí)例也是可序列化的。

          一個(gè)典型的事務(wù)應(yīng)該使用下面的形式:

           Session sess = factory.openSession();
          Transaction tx;
          try {
          tx = sess.beginTransaction();
          //do some work
          ...
          tx.commit();
          }
          catch (Exception e) {
          if (tx!=null) tx.rollback();
          throw e;
          }
          finally {
          sess.close();
          }
          

          如果Session拋出了異常, 事務(wù)必須回滾而session會(huì)被廢棄。在異常發(fā)生后Session的內(nèi)部狀態(tài)可能會(huì)與數(shù)據(jù)庫(kù)失去同步。

           

           

          Author:
          Gavin King
          See Also:
          SessionFactory

          Method Summary
           Transaction beginTransaction()
                    開始一個(gè)工作單元并且返回相關(guān)聯(lián)的事務(wù)(Transaction)對(duì)象。
           void cancelQuery()
                    終止執(zhí)行當(dāng)前查詢。
           void clear()
                    完整的清除這個(gè)session。
           Connection close()
                    停止這個(gè)Session,通過中斷JDBC連接并且清空(cleaning up)它。
           Connection connection()
                    獲取這個(gè)Session的JDBC連接。

          如果這個(gè)session使用了積極的collection釋放策略(如CMT-容器控制事務(wù)的環(huán)境下),關(guān)閉這個(gè)調(diào)用的連接的職責(zé)應(yīng)該由當(dāng)前應(yīng)用程序負(fù)責(zé)。
           boolean contains(Object object)
                    檢查這個(gè)對(duì)象實(shí)例是否與當(dāng)前的Session關(guān)聯(lián)(即是否為Persistent狀態(tài))。
           Criteria createCriteria(Class persistentClass)
                    為給定的實(shí)體類或它的超類創(chuàng)建一個(gè)新的Criteria實(shí)例。
           Criteria createCriteria(Class persistentClass, String alias)
                    根據(jù)給定的實(shí)體類或者它的超類創(chuàng)建一個(gè)新的Criteria實(shí)例,并賦予它(實(shí)體類)一個(gè)別名。
           Criteria createCriteria(String entityName)
                    根據(jù)給定的實(shí)體的名稱(name),創(chuàng)建一個(gè)新的Criteria實(shí)例。
           Criteria createCriteria(String entityName, String alias)
                    根據(jù)給定的實(shí)體的名稱(name),創(chuàng)建一個(gè)新的Criteria實(shí)例,并賦予它(實(shí)體類)一個(gè)別名
           Query createFilter(Object collection, String queryString)
                    根據(jù)給定的collection和過濾字符串(查詢條件)創(chuàng)建一個(gè)新的Query實(shí)例。
           Query createQuery(String queryString)
                    根據(jù)給定的HQL查詢條件創(chuàng)建一個(gè)新的Query實(shí)例。
           SQLQuery createSQLQuery(String queryString)
                    根據(jù)給定的SQL查詢條件創(chuàng)建一個(gè)新的SQLQuery實(shí)例。
           void delete(Object object)
                    從數(shù)據(jù)庫(kù)中移除持久化(persistent)對(duì)象的實(shí)例。
           void delete(String entityName, Object object)
                    從數(shù)據(jù)庫(kù)中移除持久化(persistent)對(duì)象的實(shí)例。
           void disableFilter(String filterName)
                    禁用當(dāng)前session的名稱過濾器。
           Connection disconnect()
                    斷開Session與當(dāng)前的JDBC連接。
           Filter enableFilter(String filterName)
                    打開當(dāng)前session的名稱過濾器。
           void evict(Object object)
                    將當(dāng)前對(duì)象實(shí)例從session緩存中清除。
           void flush()
                    強(qiáng)制提交清理(flush)Session
           Object get(Class clazz, Serializable id)
                    根據(jù)給定標(biāo)識(shí)和實(shí)體類返回持久化對(duì)象的實(shí)例,如果沒有符合條件的持久化對(duì)象實(shí)例則返回null。
           Object get(Class clazz, Serializable id, LockMode lockMode)
                    根據(jù)給定標(biāo)識(shí)和實(shí)體類返回持久化對(duì)象的實(shí)例,如果沒有符合條件的持久化對(duì)象實(shí)例則返回null。
           Object get(String entityName, Serializable id)
                    返回與給定的實(shí)體命名和標(biāo)識(shí)匹配的持久化實(shí)例,如果沒有對(duì)應(yīng)的持久化實(shí)例則返回null。
           Object get(String entityName, Serializable id, LockMode lockMode)
                    返回與給定的實(shí)體類和標(biāo)識(shí)所匹配的持久化實(shí)例,如果沒有對(duì)應(yīng)的持久化實(shí)例則返回null。
           CacheMode getCacheMode()
                    得到當(dāng)前的緩存模式。
           LockMode getCurrentLockMode(Object object)
                    檢測(cè)給定對(duì)象當(dāng)前的鎖定級(jí)別。
           Filter getEnabledFilter(String filterName)
                    根據(jù)名稱獲取一個(gè)當(dāng)前允許的過濾器(filter)。
           EntityMode getEntityMode()
                    獲取這個(gè)session有效的實(shí)體模式。
           String getEntityName(Object object)
                    返回一個(gè)持久化對(duì)象的實(shí)體名稱。
           FlushMode getFlushMode()
                    獲得當(dāng)前的刷新提交(flush)模式。
           Serializable getIdentifier(Object object)
                    獲取給定的實(shí)體對(duì)象實(shí)例在Session的緩存中的標(biāo)識(shí),如果該實(shí)例是自由狀態(tài)(Transient)的或者與其它Session關(guān)聯(lián)則拋出一個(gè)異常。
           Query getNamedQuery(String queryName)
                    從映射文件中根據(jù)給定的查詢的名稱字符串獲取一個(gè)Query(查詢)實(shí)例。
           Session getSession(EntityMode entityMode)
                    根據(jù)給定的實(shí)體模式(Entity Mode)開始一個(gè)新的有效的Session。
           SessionFactory getSessionFactory()
                    獲取創(chuàng)建這個(gè)session的SessionFactory實(shí)例。
           SessionStatistics getStatistics()
                    獲取這個(gè)session的統(tǒng)計(jì)信息。
           Transaction getTransaction()
                    獲取與這個(gè)session關(guān)聯(lián)的Transaction(事務(wù))實(shí)例。 instance associated with this session.
           boolean isConnected()
                    檢查當(dāng)前Session是否處于連接狀態(tài)。
           boolean isDirty()
                    當(dāng)前Session是否包含需要與數(shù)據(jù)庫(kù)同步的(數(shù)據(jù)狀態(tài))變化 ?如果我們刷新提交(flush)這個(gè)session是否會(huì)有SQL執(zhí)行?
           boolean isOpen()
                    檢查當(dāng)前Session是否仍然打開。
           Object load(Class theClass, Serializable id)
                    在符合條件的實(shí)例存在的情況下,根據(jù)給定的實(shí)體類和標(biāo)識(shí)返回持久化狀態(tài)的實(shí)例。
           Object load(Class theClass, Serializable id, LockMode lockMode)
                    在符合條件的實(shí)例存在的情況下,根據(jù)給定的實(shí)體類、標(biāo)識(shí)及指定的鎖定等級(jí)返回持久化狀態(tài)的實(shí)例。
           void load(Object object, Serializable id)
                    將與給定的標(biāo)示對(duì)應(yīng)的持久化狀態(tài)(值)復(fù)制到給定的自由狀態(tài)(trasient)實(shí)例上。
           Object load(String entityName, Serializable id)
                    在符合條件的實(shí)例存在的情況下,根據(jù)給定的實(shí)體類和標(biāo)識(shí)返回持久化狀態(tài)的實(shí)例。
           Object load(String entityName, Serializable id, LockMode lockMode)
                    在符合條件的實(shí)例存在的情況下,根據(jù)給定的實(shí)體類、標(biāo)識(shí)及指定的鎖定等級(jí)返回持久化狀態(tài)的實(shí)例。
           void lock(Object object, LockMode lockMode)
                    從給定的對(duì)象上獲取指定的鎖定級(jí)別。
           void lock(String entityName, Object object, LockMode lockMode)
                    從給定的對(duì)象上獲取指定的鎖定級(jí)別。
           Object merge(Object object)
                    將給定的對(duì)象的狀態(tài)復(fù)制到具有相同標(biāo)識(shí)的持久化對(duì)象上。
           Object merge(String entityName, Object object)
                    將給定的對(duì)象的狀態(tài)復(fù)制到具有相同標(biāo)識(shí)的持久化對(duì)象上。
           void persist(Object object)
                    將一個(gè)自由狀態(tài)(transient)的實(shí)例持久化。
           void persist(String entityName, Object object)
                    將一個(gè)自由狀態(tài)(transient)的實(shí)例持久化。
           void reconnect()
                    不推薦的。 手工的重新連接只應(yīng)用于應(yīng)用程序提供連接的情況,在這種情況下或許應(yīng)該使用reconnect(java.sql.Connection)
           void reconnect(Connection connection)
                    重新連接到給定的JDBC連接。
           void refresh(Object object)
                    從數(shù)據(jù)庫(kù)中重新讀取給定實(shí)例的狀態(tài)。
           void refresh(Object object, LockMode lockMode)
                    根據(jù)指定的鎖定模式(LockMode),從數(shù)據(jù)庫(kù)中重新讀取給定實(shí)例的狀態(tài)。
           void replicate(Object object, ReplicationMode replicationMode)
                    使用當(dāng)前的標(biāo)識(shí)值持久化給定的游離狀態(tài)(Transient)的實(shí)體。
           void replicate(String entityName, Object object, ReplicationMode replicationMode)
                    使用當(dāng)前的標(biāo)識(shí)值持久化給定的游離狀態(tài)(Transient)的實(shí)體。
           Serializable save(Object object)
                    首先為給定的自由狀態(tài)(Transient)的對(duì)象(根據(jù)配置)生成一個(gè)標(biāo)識(shí)并賦值,然后將其持久化。
           Serializable save(String entityName, Object object)
                    首先為給定的自由狀態(tài)(Transient)的對(duì)象(根據(jù)配置)生成一個(gè)標(biāo)識(shí)并賦值,然后將其持久化。
           void saveOrUpdate(Object object)
                    根據(jù)給定的實(shí)例的標(biāo)識(shí)屬性的值(注:可以指定unsaved-value。一般默認(rèn)null。)來決定執(zhí)行 save()update()操作。
           void saveOrUpdate(String entityName, Object object)
                    根據(jù)給定的實(shí)例的標(biāo)識(shí)屬性的值(注:可以指定unsaved-value。一般默認(rèn)null。)來決定執(zhí)行 save()update()操作。
           void setCacheMode(CacheMode cacheMode)
                    設(shè)置刷新提交模式。
           void setFlushMode(FlushMode flushMode)
                    設(shè)置刷新提交模式。
           void setReadOnly(Object entity, boolean readOnly)
                    將一個(gè)未經(jīng)更改的持久化對(duì)象設(shè)置為只讀模式,或者將一個(gè)只讀對(duì)象標(biāo)記為可以修改的模式。
           void update(Object object)
                    根據(jù)給定的detached(游離狀態(tài))對(duì)象實(shí)例的標(biāo)識(shí)更新對(duì)應(yīng)的持久化實(shí)例。
           void update(String entityName, Object object)
                    根據(jù)給定的detached(游離狀態(tài))對(duì)象實(shí)例的標(biāo)識(shí)更新對(duì)應(yīng)的持久化實(shí)例。
           

          posted on 2006-03-06 20:09 Tin 閱讀(10748) 評(píng)論(7)  編輯  收藏 所屬分類: Hibernate相關(guān)

          評(píng)論

          # re: 翻譯的Hibernate的Session的javadoc 2006-03-07 13:02 airblue
          謝謝,正在找這樣的資料!  回復(fù)  更多評(píng)論
            

          # re: 翻譯的Hibernate的Session的javadoc 2006-03-08 21:00 111
          我在進(jìn)行
          //前面對(duì)Cat實(shí)體進(jìn)行付值
          sess.save(cat);
          sess.flush();
          //在這里修改CAT的某個(gè)屬性值再付給CAT
          sess.refresh(cat,upgrade);
          之后;數(shù)據(jù)庫(kù)里出現(xiàn)了兩條cat紀(jì)錄。而不是修改后的CAT的紀(jì)錄。
          請(qǐng)問這是正常的嗎?
          如果我要數(shù)據(jù)庫(kù)里只保存修改后的那條紀(jì)錄應(yīng)該怎么辦呢  回復(fù)  更多評(píng)論
            

          # re: 翻譯的Hibernate的Session的javadoc 2006-03-08 21:41 Tin
          @111
          你在save前cat是如何創(chuàng)建的?save應(yīng)該操作new出來的VO。
          你的Cat里面是否引用其它的Cat實(shí)例(涉及到Cascade問題)?

          推薦你用P6Spy跟蹤一下,很快會(huì)發(fā)現(xiàn)問題出在哪里。或者簡(jiǎn)單的把show_sql設(shè)為true跟蹤一下也可以。

          P6Spy的使用可以參考這里:
          http://www.aygfsteel.com/hexuzhong/archive/2006/01/28/29345.html

            回復(fù)  更多評(píng)論
            

          # re: 翻譯的Hibernate的Session的javadoc 2006-06-22 15:44 HellyGuo
          謝謝翻譯  回復(fù)  更多評(píng)論
            

          # re: 翻譯的Hibernate的Session的javadoc 2006-09-23 21:20 123456
          @111
          gfgfg  回復(fù)  更多評(píng)論
            

          # re: 翻譯的Hibernate的Session的javadoc 2007-07-04 19:40 billy
          請(qǐng)問有session的原代碼么?
          最近要寫一個(gè)仿hibernate 的程序 頭痛啊   回復(fù)  更多評(píng)論
            

          # re: 翻譯的Hibernate的Session的javadoc 2008-06-03 18:03 freeren
          flush是刷新嗎?在我看來用清理更合適吧?  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 大悟县| 鄂尔多斯市| 郯城县| 兰坪| 荔波县| 射阳县| 衡阳县| 田东县| 岳池县| 祁连县| 多伦县| 定远县| 凌海市| 镇赉县| 北辰区| 循化| 古交市| 甘南县| 新闻| 宁蒗| 绥江县| 浏阳市| 嘉善县| 呼和浩特市| 涞源县| 个旧市| 舒城县| 靖州| 沂源县| 大埔区| 肇庆市| 张家川| 白山市| 江油市| 合阳县| 平罗县| 永宁县| 怀柔区| 肃宁县| 公主岭市| 濉溪县|