<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Tin's Blog

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      128 隨筆 :: 0 文章 :: 221 評論 :: 0 Trackbacks
    Hibernate的透明持久化用起來非常舒服,有時(shí)甚至忘記了數(shù)據(jù)庫的存在。我身邊的朋友經(jīng)常會(huì)分不清save、saveOrUpdate、update的區(qū)別,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且關(guān)于實(shí)體對象的生命周期也有很多概念不清,分不清transient、persistent、detached的區(qū)別,只是知道PO、VO這樣的通俗叫法。其實(shí)這些概念都很簡單,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)上面。(長的事務(wù)可能跨越多個(gè)數(shù)據(jù)庫事物。)

    Session的主要功能是提供對映射的實(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。對持久化(persistent)實(shí)例的修改在刷新提交的時(shí)候會(huì)被檢測到,它也會(huì)引起SQLUPDATEsaveOrUpdate()或者replicate()會(huì)引發(fā)SQLINSERT或者UPDATE

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

    如果其持久化對象類是可序列化的,則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ù)庫失去同步。

     

     

    Author:
    Gavin King
    See Also:
    SessionFactory

    Method Summary
     Transaction beginTransaction()
              開始一個(gè)工作單元并且返回相關(guān)聯(lián)的事務(wù)(Transaction)對象。
     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è)對象實(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ù)庫中移除持久化(persistent)對象的實(shí)例。
     void delete(String entityName, Object object)
              從數(shù)據(jù)庫中移除持久化(persistent)對象的實(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)前對象實(shí)例從session緩存中清除。
     void flush()
              強(qiáng)制提交清理(flush)Session
     Object get(Class clazz, Serializable id)
              根據(jù)給定標(biāo)識(shí)和實(shí)體類返回持久化對象的實(shí)例,如果沒有符合條件的持久化對象實(shí)例則返回null。
     Object get(Class clazz, Serializable id, LockMode lockMode)
              根據(jù)給定標(biāo)識(shí)和實(shí)體類返回持久化對象的實(shí)例,如果沒有符合條件的持久化對象實(shí)例則返回null。
     Object get(String entityName, Serializable id)
              返回與給定的實(shí)體命名和標(biāo)識(shí)匹配的持久化實(shí)例,如果沒有對應(yīng)的持久化實(shí)例則返回null。
     Object get(String entityName, Serializable id, LockMode lockMode)
              返回與給定的實(shí)體類和標(biāo)識(shí)所匹配的持久化實(shí)例,如果沒有對應(yīng)的持久化實(shí)例則返回null。
     CacheMode getCacheMode()
              得到當(dāng)前的緩存模式。
     LockMode getCurrentLockMode(Object object)
              檢測給定對象當(dāng)前的鎖定級(jí)別。
     Filter getEnabledFilter(String filterName)
              根據(jù)名稱獲取一個(gè)當(dāng)前允許的過濾器(filter)。
     EntityMode getEntityMode()
              獲取這個(gè)session有效的實(shí)體模式。
     String getEntityName(Object object)
              返回一個(gè)持久化對象的實(shí)體名稱。
     FlushMode getFlushMode()
              獲得當(dāng)前的刷新提交(flush)模式。
     Serializable getIdentifier(Object object)
              獲取給定的實(shí)體對象實(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ù)庫同步的(數(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)示對應(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)
              從給定的對象上獲取指定的鎖定級(jí)別。
     void lock(String entityName, Object object, LockMode lockMode)
              從給定的對象上獲取指定的鎖定級(jí)別。
     Object merge(Object object)
              將給定的對象的狀態(tài)復(fù)制到具有相同標(biāo)識(shí)的持久化對象上。
     Object merge(String entityName, Object object)
              將給定的對象的狀態(tài)復(fù)制到具有相同標(biāo)識(shí)的持久化對象上。
     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ù)庫中重新讀取給定實(shí)例的狀態(tài)。
     void refresh(Object object, LockMode lockMode)
              根據(jù)指定的鎖定模式(LockMode),從數(shù)據(jù)庫中重新讀取給定實(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)的對象(根據(jù)配置)生成一個(gè)標(biāo)識(shí)并賦值,然后將其持久化。
     Serializable save(String entityName, Object object)
              首先為給定的自由狀態(tài)(Transient)的對象(根據(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)更改的持久化對象設(shè)置為只讀模式,或者將一個(gè)只讀對象標(biāo)記為可以修改的模式。
     void update(Object object)
              根據(jù)給定的detached(游離狀態(tài))對象實(shí)例的標(biāo)識(shí)更新對應(yīng)的持久化實(shí)例。
     void update(String entityName, Object object)
              根據(jù)給定的detached(游離狀態(tài))對象實(shí)例的標(biāo)識(shí)更新對應(yīng)的持久化實(shí)例。
     

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

    評論

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

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

    # 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)問題出在哪里。或者簡單的把show_sql設(shè)為true跟蹤一下也可以。

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

      回復(fù)  更多評論
      

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

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

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

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

    主站蜘蛛池模板: 国产亚洲精品国看不卡| 国产精品免费看久久久香蕉| 国产av无码专区亚洲av桃花庵| 啦啦啦手机完整免费高清观看| 久别的草原电视剧免费观看| 边摸边吃奶边做爽免费视频网站| 亚洲国产片在线观看| 亚洲人成人网站色www| 国产精品深夜福利免费观看| 午夜免费1000部| 日韩精品免费在线视频| 又长又大又粗又硬3p免费视频| 国产亚洲精品bv在线观看| 亚洲美女大bbbbbbbbb| 亚洲AV无码成人精品区天堂| 亚洲性日韩精品一区二区三区| 看全色黄大色大片免费久久| 午夜国产精品免费观看 | 免费观看久久精彩视频| 日韩精品无码免费视频| 狠狠综合亚洲综合亚洲色| 亚洲va中文字幕| 亚洲国产成人手机在线观看| 色婷五月综激情亚洲综合 | 美女被免费喷白浆视频| 中文字幕免费高清视频| 秋霞人成在线观看免费视频| 国产一区二区三区免费观在线| 四虎国产精品永免费| 特级av毛片免费观看| 羞羞网站免费观看| 国产AV无码专区亚洲AV琪琪| 国产综合成人亚洲区| 亚洲AV无码成人精品区日韩| 亚洲精品无码高潮喷水A片软| 色天使亚洲综合在线观看| 亚洲已满18点击进入在线观看| 亚洲avav天堂av在线网爱情| 亚洲AV无码一区二区三区牛牛| 亚洲成a人片在线不卡| 亚洲日本一线产区和二线|