<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      128 隨筆 :: 0 文章 :: 221 評論 :: 0 Trackbacks
    Hibernate的透明持久化用起來非常舒服,有時甚至忘記了數據庫的存在。我身邊的朋友經常會分不清save、saveOrUpdate、update的區別,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且關于實體對象的生命周期也有很多概念不清,分不清transient、persistent、detached的區別,只是知道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應用程序與Hibernate之間的主要運行時接口。它是抽象了持久化服務概念的核心抽象API類。

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

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

    自由狀態(transient): 不曾進行持久化,未與任何Session相關聯
    持久化狀態(persistent): 僅與一個Session相關聯
    游離狀態(detached): 已經進行過持久化,但當前未與任何Session相關聯

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

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

    其具體實現并不一定是線程安全的。每個線程/事務應該從一個SessionFactory獲取自己的session實例。

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

    一個典型的事務應該使用下面的形式:

     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拋出了異常, 事務必須回滾而session會被廢棄。在異常發生后Session的內部狀態可能會與數據庫失去同步。

     

     

    Author:
    Gavin King
    See Also:
    SessionFactory

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

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

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

    評論

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

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

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

    推薦你用P6Spy跟蹤一下,很快會發現問題出在哪里。或者簡單的把show_sql設為true跟蹤一下也可以。

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

      回復  更多評論
      

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

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

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

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

    主站蜘蛛池模板: 亚洲狠狠爱综合影院婷婷| 久久精品国产亚洲AV嫖农村妇女| 成人a视频片在线观看免费| 免费看黄视频网站| 永久黄网站色视频免费直播| 亚洲毛片基地日韩毛片基地| 曰批全过程免费视频在线观看无码| 日本免费一区二区三区四区五六区 | 国内精品99亚洲免费高清| 久久精品亚洲精品国产色婷| 最近最好的中文字幕2019免费| 亚洲国产精品成人精品软件| 99国产精品视频免费观看| 久久精品国产精品亚洲艾| 亚洲日韩一区二区一无码| 2021国产精品成人免费视频| 亚洲一区精品伊人久久伊人| 国产JIZZ中国JIZZ免费看| h片在线免费观看| 亚洲一区在线免费观看| 2015日韩永久免费视频播放 | 亚洲人成综合在线播放| 中文字幕无码播放免费| 人人公开免费超级碰碰碰视频| 亚洲国产成人乱码精品女人久久久不卡 | 成人免费在线观看网站| 少妇性饥渴无码A区免费| 亚洲国产精品VA在线看黑人| 亚洲欧美日韩中文字幕一区二区三区| 久久经典免费视频| 亚洲国产精品久久久久秋霞小| 日韩精品视频免费观看| 四虎国产精品永免费| 中文字幕精品无码亚洲字| 久久国产乱子伦精品免费强| 亚洲国产成人精品无码久久久久久综合| 美女黄网站人色视频免费| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲天堂福利视频| 亚洲精品无码MV在线观看| 久久久久久精品免费免费自慰|