隨筆-1  評論-0  文章-1  trackbacks-0
            2006年4月7日
          Hibernate的透明持久化用起來非常舒服,有時甚至忘記了數(shù)據(jù)庫的存在。我身邊的朋友經(jīng)常會分不清save、saveOrUpdate、update的區(qū)別,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且關(guān)于實體對象的生命周期也有很多概念不清,分不清transient、persistent、detached的區(qū)別,只是知道PO、VO這樣的通俗叫法。其實這些概念都很簡單,Hibernate的javadoc寫的都很清楚,只需看看就能明白。所以我花了些時間將Hibernate 3.1.2中session的javadoc部分翻譯了一下,旨在讓那些因為Hibernate的“透明”而忘記了它基本概念的人們停下來再看看這些概念


          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之間的主要運行時接口。它是抽象了持久化服務(wù)概念的核心抽象API類。

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

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

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

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

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

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

          如果其持久化對象類是可序列化的,則Session實例也是可序列化的。

          一個典型的事務(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會被廢棄。在異常發(fā)生后Session的內(nèi)部狀態(tài)可能會與數(shù)據(jù)庫失去同步。

          Author:
          Gavin King
          See Also:
          SessionFactory


          Method Summary
          ?TransactionbeginTransaction()
          ??????????開始一個工作單元并且返回相關(guān)聯(lián)的事務(wù)(Transaction)對象。
          ?voidcancelQuery()
          ??????????終止執(zhí)行當(dāng)前查詢。
          ?voidclear()
          ??????????完整的清除這個session。
          ?Connectionclose()
          ??????????停止這個Session,通過中斷JDBC連接并且清空(cleaning up)它。
          ?Connectionconnection()
          ??????????獲取這個Session的JDBC連接。

          如果這個session使用了積極的collection釋放策略(如CMT-容器控制事務(wù)的環(huán)境下),關(guān)閉這個調(diào)用的連接的職責(zé)應(yīng)該由當(dāng)前應(yīng)用程序負(fù)責(zé)。
          ?booleancontains(Object?object)
          ??????????檢查這個對象實例是否與當(dāng)前的Session關(guān)聯(lián)(即是否為Persistent狀態(tài))。
          ?CriteriacreateCriteria(Class?persistentClass)
          ??????????為給定的實體類或它的超類創(chuàng)建一個新的Criteria實例。
          ?CriteriacreateCriteria(Class?persistentClass, String?alias)
          ??????????根據(jù)給定的實體類或者它的超類創(chuàng)建一個新的Criteria實例,并賦予它(實體類)一個別名。
          ?CriteriacreateCriteria(String?entityName)
          ??????????根據(jù)給定的實體的名稱(name),創(chuàng)建一個新的Criteria實例。
          ?CriteriacreateCriteria(String?entityName, String?alias)
          ??????????根據(jù)給定的實體的名稱(name),創(chuàng)建一個新的Criteria實例,并賦予它(實體類)一個別名
          ?QuerycreateFilter(Object?collection, String?queryString)
          ??????????根據(jù)給定的collection和過濾字符串(查詢條件)創(chuàng)建一個新的Query實例。
          ?QuerycreateQuery(String?queryString)
          ??????????根據(jù)給定的HQL查詢條件創(chuàng)建一個新的Query實例。
          ?SQLQuerycreateSQLQuery(String?queryString)
          ??????????根據(jù)給定的SQL查詢條件創(chuàng)建一個新的SQLQuery實例。
          ?voiddelete(Object?object)
          ??????????從數(shù)據(jù)庫中移除持久化(persistent)對象的實例。
          ?voiddelete(String?entityName, Object?object)
          ??????????從數(shù)據(jù)庫中移除持久化(persistent)對象的實例。
          ?voiddisableFilter(String?filterName)
          ??????????禁用當(dāng)前session的名稱過濾器。
          ?Connectiondisconnect()
          ??????????斷開Session與當(dāng)前的JDBC連接。
          ?FilterenableFilter(String?filterName)
          ??????????打開當(dāng)前session的名稱過濾器。
          ?voidevict(Object?object)
          ??????????將當(dāng)前對象實例從session緩存中清除。
          ?voidflush()
          ??????????強制提交刷新(flush)Session
          ?Objectget(Class?clazz, Serializable?id)
          ??????????根據(jù)給定標(biāo)識和實體類返回持久化對象的實例,如果沒有符合條件的持久化對象實例則返回null。
          ?Objectget(Class?clazz, Serializable?id, LockMode?lockMode)
          ??????????根據(jù)給定標(biāo)識和實體類返回持久化對象的實例,如果沒有符合條件的持久化對象實例則返回null。
          ?Objectget(String?entityName, Serializable?id)
          ??????????返回與給定的實體命名和標(biāo)識匹配的持久化實例,如果沒有對應(yīng)的持久化實例則返回null。
          ?Objectget(String?entityName, Serializable?id, LockMode?lockMode)
          ??????????返回與給定的實體類和標(biāo)識所匹配的持久化實例,如果沒有對應(yīng)的持久化實例則返回null。
          ?CacheModegetCacheMode()
          ??????????得到當(dāng)前的緩存模式。
          ?LockModegetCurrentLockMode(Object?object)
          ??????????檢測給定對象當(dāng)前的鎖定級別。
          ?FiltergetEnabledFilter(String?filterName)
          ??????????根據(jù)名稱獲取一個當(dāng)前允許的過濾器(filter)。
          ?EntityModegetEntityMode()
          ??????????獲取這個session有效的實體模式。
          ?StringgetEntityName(Object?object)
          ??????????返回一個持久化對象的實體名稱。
          ?FlushModegetFlushMode()
          ??????????獲得當(dāng)前的刷新提交(flush)模式。
          ?SerializablegetIdentifier(Object?object)
          ??????????獲取給定的實體對象實例在Session的緩存中的標(biāo)識,如果該實例是自由狀態(tài)(Transient)的或者與其它Session關(guān)聯(lián)則拋出一個異常。
          ?QuerygetNamedQuery(String?queryName)
          ??????????從映射文件中根據(jù)給定的查詢的名稱字符串獲取一個Query(查詢)實例。
          ?SessiongetSession(EntityMode?entityMode)
          ??????????根據(jù)給定的實體模式(Entity Mode)開始一個新的有效的Session。
          ?SessionFactorygetSessionFactory()
          ??????????獲取創(chuàng)建這個session的SessionFactory實例。
          ?SessionStatisticsgetStatistics()
          ??????????獲取這個session的統(tǒng)計信息。
          ?TransactiongetTransaction()
          ??????????獲取與這個session關(guān)聯(lián)的Transaction(事務(wù))實例。 instance associated with this session.
          ?booleanisConnected()
          ??????????檢查當(dāng)前Session是否處于連接狀態(tài)。
          ?booleanisDirty()
          ??????????當(dāng)前Session是否包含需要與數(shù)據(jù)庫同步的(數(shù)據(jù)狀態(tài))變化 ?如果我們刷新提交(flush)這個session是否會有SQL執(zhí)行?
          ?booleanisOpen()
          ??????????檢查當(dāng)前Session是否仍然打開。
          ?Objectload(Class?theClass, Serializable?id)
          ??????????在符合條件的實例存在的情況下,根據(jù)給定的實體類和標(biāo)識返回持久化狀態(tài)的實例。
          ?Objectload(Class?theClass, Serializable?id, LockMode?lockMode)
          ??????????在符合條件的實例存在的情況下,根據(jù)給定的實體類、標(biāo)識及指定的鎖定等級返回持久化狀態(tài)的實例。
          ?voidload(Object?object, Serializable?id)
          ??????????將與給定的標(biāo)示對應(yīng)的持久化狀態(tài)(值)復(fù)制到給定的自由狀態(tài)(trasient)實例上。
          ?Objectload(String?entityName, Serializable?id)
          ??????????在符合條件的實例存在的情況下,根據(jù)給定的實體類和標(biāo)識返回持久化狀態(tài)的實例。
          ?Objectload(String?entityName, Serializable?id, LockMode?lockMode)
          ??????????在符合條件的實例存在的情況下,根據(jù)給定的實體類、標(biāo)識及指定的鎖定等級返回持久化狀態(tài)的實例。
          ?voidlock(Object?object, LockMode?lockMode)
          ??????????從給定的對象上獲取指定的鎖定級別。
          ?voidlock(String?entityName, Object?object, LockMode?lockMode)
          ??????????從給定的對象上獲取指定的鎖定級別。
          ?Objectmerge(Object?object)
          ??????????將給定的對象的狀態(tài)復(fù)制到具有相同標(biāo)識的持久化對象上。
          ?Objectmerge(String?entityName, Object?object)
          ??????????將給定的對象的狀態(tài)復(fù)制到具有相同標(biāo)識的持久化對象上。
          ?voidpersist(Object?object)
          ??????????將一個自由狀態(tài)(transient)的實例持久化。
          ?voidpersist(String?entityName, Object?object)
          ??????????將一個自由狀態(tài)(transient)的實例持久化。
          ?voidreconnect()
          ??????????不推薦的。?手工的重新連接只應(yīng)用于應(yīng)用程序提供連接的情況,在這種情況下或許應(yīng)該使用reconnect(java.sql.Connection)
          ?voidreconnect(Connection?connection)
          ??????????重新連接到給定的JDBC連接。
          ?voidrefresh(Object?object)
          ??????????從數(shù)據(jù)庫中重新讀取給定實例的狀態(tài)。
          ?voidrefresh(Object?object, LockMode?lockMode)
          ??????????根據(jù)指定的鎖定模式(LockMode),從數(shù)據(jù)庫中重新讀取給定實例的狀態(tài)。
          ?voidreplicate(Object?object, ReplicationMode?replicationMode)
          ??????????使用當(dāng)前的標(biāo)識值持久化給定的游離狀態(tài)(Transient)的實體。
          ?voidreplicate(String?entityName, Object?object, ReplicationMode?replicationMode)
          ??????????使用當(dāng)前的標(biāo)識值持久化給定的游離狀態(tài)(Transient)的實體。
          ?Serializablesave(Object?object)
          ??????????首先為給定的自由狀態(tài)(Transient)的對象(根據(jù)配置)生成一個標(biāo)識并賦值,然后將其持久化。
          ?Serializablesave(String?entityName, Object?object)
          ??????????首先為給定的自由狀態(tài)(Transient)的對象(根據(jù)配置)生成一個標(biāo)識并賦值,然后將其持久化。
          ?voidsaveOrUpdate(Object?object)
          ??????????根據(jù)給定的實例的標(biāo)識屬性的值(注:可以指定unsaved-value。一般默認(rèn)null。)來決定執(zhí)行 save()update()操作。
          ?voidsaveOrUpdate(String?entityName, Object?object)
          ??????????根據(jù)給定的實例的標(biāo)識屬性的值(注:可以指定unsaved-value。一般默認(rèn)null。)來決定執(zhí)行 save()update()操作。
          ?voidsetCacheMode(CacheMode?cacheMode)
          ??????????設(shè)置刷新提交模式。
          ?voidsetFlushMode(FlushMode?flushMode)
          ??????????設(shè)置刷新提交模式。
          ?voidsetReadOnly(Object?entity, boolean?readOnly)
          ??????????將一個未經(jīng)更改的持久化對象設(shè)置為只讀模式,或者將一個只讀對象標(biāo)記為可以修改的模式。
          ?voidupdate(Object?object)
          ??????????根據(jù)給定的detached(游離狀態(tài))對象實例的標(biāo)識更新對應(yīng)的持久化實例。
          ?voidupdate(String?entityName, Object?object)
          ??????????根據(jù)給定的detached(游離狀態(tài))對象實例的標(biāo)識更新對應(yīng)的持久化實例。
          ?

          from:http://www.aygfsteel.com/iamtin/archive/2006/03/06/33910.html

          posted @ 2006-04-07 22:04 博客java 閱讀(255) | 評論 (0)編輯 收藏
          僅列出標(biāo)題  
          主站蜘蛛池模板: 台北县| 昌邑市| 嘉兴市| 邮箱| 承德县| 彰武县| 门头沟区| 张家界市| 石阡县| 沾化县| 安泽县| 长沙市| 台中市| 莆田市| 马山县| 长白| 赤峰市| 依兰县| 正阳县| 周至县| 台湾省| 满洲里市| 长沙县| 禹城市| 如皋市| 铁岭市| 容城县| 敦煌市| 锦屏县| 澄迈县| 永新县| 故城县| 黄陵县| 象州县| 德清县| 大新县| 民勤县| 建德市| 偃师市| 上思县| 淳化县|