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

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

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

    隨筆-7  評(píng)論-24  文章-102  trackbacks-0


    1、對(duì)象關(guān)系映射

    1-1、單向多對(duì)一關(guān)聯(lián)

     產(chǎn)品和分類的關(guān)系:多個(gè)不同產(chǎn)品屬于同一種分類。
    private Category category;
    <many-to-one name="category" column="categoryId" not-null="true" />


    1-2、一對(duì)多映射
    private Set products = new HashSet();
    <set name="products"  <!--Category 中集合屬性名稱為 products-->
      table="product"  <!--集合屬性對(duì)應(yīng)表的名稱為 product-->
      schema="test"   <!--表的 schema 名稱為 test-->
      lazy="true"   <!--此集合采用延時(shí)加載策略-->
      inverse="true"  <!--由關(guān)聯(lián)屬性的另一方作為關(guān)聯(lián)的主控方-->
      cascade="delete"  <!--采用級(jí)聯(lián)刪除,當(dāng) Category 被刪除時(shí)關(guān)聯(lián)的此集合內(nèi)容也將被刪除-->
      sort="natural"  <!--自然排序集合內(nèi)容-->
      order-by="productId asc" <!--按 productId 字段升序排列集合內(nèi)容-->
      >
      <key column="category_fk" />
     
      <one-to-many class="petstore.domain.Product" />
    </set>


    1-3、繼承映射



    2、Hibernate 操作對(duì)象

    2-1、對(duì)象的三種狀態(tài)

    ● 瞬時(shí)態(tài)(Transient)--VO(Value Ojbect)
      對(duì)象實(shí)例產(chǎn)生到被 JVM 垃圾回收為止并不受 Hibernate 框架管理。

    ● 持久態(tài)(Persistent)--PO(Persistent Ojbect)
      對(duì)象實(shí)例被 Hibernate 框架管理,該對(duì)象可能是剛被保存的,或剛從數(shù)據(jù)庫(kù)中被加載的。Hibernate 會(huì)檢測(cè)處于持久態(tài)的對(duì)象任何改動(dòng),在當(dāng)前操作單元執(zhí)行完畢將對(duì)象與數(shù)據(jù)庫(kù)同步,即將對(duì)象的屬性保存到數(shù)據(jù)庫(kù)映射對(duì)應(yīng)的字段中。簡(jiǎn)單點(diǎn)說(shuō)就是該實(shí)體對(duì)象與 session 發(fā)生關(guān)系,而且處于 session 的有效期內(nèi)。
     
    ● 托管態(tài)(Detached)--VO(Value Ojbect)
      與持久對(duì)象關(guān)聯(lián)的 Session 被關(guān)閉后,對(duì)象就變?yōu)橥泄艿?,可繼續(xù)被修改。托管對(duì)象如果重新關(guān)聯(lián)到某個(gè)新的 Session 上,會(huì)再次變?yōu)槌志玫模瑫r(shí)改動(dòng)也將會(huì)被持久化到數(shù)據(jù)庫(kù)。這個(gè)期間的轉(zhuǎn)變過(guò)程可以看作是應(yīng)用程序事務(wù),即中間會(huì)給用戶思考時(shí)間的長(zhǎng)時(shí)間運(yùn)行的操作單元。
      處于托管態(tài)對(duì)象具有與數(shù)據(jù)庫(kù)表記錄間的聯(lián)系(持久化標(biāo)識(shí),identifier)。



    2-2、對(duì)象操作的應(yīng)用程序接口

    ● 修改對(duì)象

      對(duì)于已經(jīng)持久化的對(duì)象,不需要調(diào)用某個(gè)特定的方法就可以實(shí)現(xiàn)修改持久化,因?yàn)?Hibernate 會(huì)自動(dòng)調(diào)用 flush() 方法保證與數(shù)據(jù)庫(kù)的同步。

      對(duì)于處于托管狀態(tài)的實(shí)例,Hibernate 通過(guò)提供 Session.update() 或 Session.merge() 方法,重新關(guān)聯(lián)托管實(shí)例。但是需要注意的是:如果具有持久化標(biāo)識(shí)(identifier)的對(duì)象之前已經(jīng)被另一個(gè)會(huì)話連接(secondSession)裝載了,應(yīng)用程序關(guān)聯(lián)操作會(huì)發(fā)生異常。

      使用 merge() 方法時(shí),用戶不必考慮 session 的狀態(tài),可隨時(shí)將修改保存到數(shù)據(jù)庫(kù)中。例如:Session 中存在相同標(biāo)識(shí)的持久化實(shí)例時(shí),Hibernate 便會(huì)根據(jù)用戶給出的對(duì)象狀態(tài)覆蓋原有的持久化實(shí)例的狀態(tài)。

      另外,Hibernate 還提供了 saveOrUpdate()方法,它即可分配新持久化標(biāo)識(shí)(identifier),保存瞬時(shí)(transient)對(duì)象,又可更新/重新關(guān)聯(lián)托管的(identifier)實(shí)例。


    ● 刪除對(duì)象
      通過(guò) HQL 語(yǔ)句,調(diào)用重載的 delete(),可以一次刪除多個(gè)對(duì)象。
      session.delete("from Customer as c where c.customerId <3");


    ● 查詢對(duì)象
      已知對(duì)象表示符值查詢
      對(duì)象標(biāo)識(shí)符未知查詢 HQL
      根據(jù)某些特定條件查詢 QBC,Query By Criteria
      按詳例查詢 QBE,Query By Example
      調(diào)用數(shù)據(jù)庫(kù)查詢 native SQL

      查詢條件參數(shù) ? 查詢條件參數(shù)索引,由 0 開始。
      查詢條件實(shí)名 :name
      外置命名查詢

        在映射文件定義查詢語(yǔ)句,將程序與查詢語(yǔ)句分離:
        <query name="CategoryById"
     <! [CDATA[
      from Category c where c.categoryId>? ]]>
        </query>

        程序調(diào)用:
          Query q = sess.getNamedQuery("CategoryById");
          q.setLong(0, name);
          List cats = q.List();
       
      用 Query 提供的 iterate() 方法遍歷查詢結(jié)果,如果查詢的結(jié)果在 session 或二級(jí)緩存(second-level cache)中,那么使用 iterate() 方法可以得到更好的性能。

      如果 JDBC 驅(qū)動(dòng)支持可滾動(dòng)的 ResuleSet,Query 接口可以使用 ScrollableResults,允許你在查詢結(jié)果中靈活移動(dòng)(需要保持?jǐn)?shù)據(jù)庫(kù)連接和游標(biāo) cursor 處于抑制打開狀態(tài))。

    ScrollableResults cates = q.scroll();
    cates.first()
    cates.scroll(5);


    ● cascade 和 inverse 級(jí)聯(lián)操作

    inverse
      只對(duì) set,one-to-many(或 many-to-many)有效,對(duì)于 many-to-one,one-to-one 無(wú)效
      對(duì)集合起整體作用

    cascade
      對(duì)關(guān)系標(biāo)記都有效
      對(duì)集合的一個(gè)元素起作用,如果集合為空,那么 cascade 不會(huì)引發(fā)關(guān)聯(lián)操作
     
      作用時(shí)機(jī):在 flush 時(shí)(commit 會(huì)自動(dòng)執(zhí)行 flush),hibernate 會(huì)自行判斷每個(gè) set 是否有變化,對(duì)有變化的 set 執(zhí)行相應(yīng)的 SQL,if (inverse) return。即:cascade 在前,inverse 在后。

    異常:
    org.hibernate.exception.ConstraintViolationException: could not insert

    原因是 category_fk 字段約束不能為空,而在新建的 Product 對(duì)象時(shí)插入了空值,而且關(guān)聯(lián)關(guān)系由 Caterogy 對(duì)象維持,而被關(guān)聯(lián)的 Product 對(duì)象不知道自己與哪個(gè) Category 對(duì)象關(guān)聯(lián)。說(shuō)到底就是 pro 對(duì)象的 categoryId 值為空。

     

    posted on 2009-04-11 20:46 黃小二 閱讀(430) 評(píng)論(0)  編輯  收藏 所屬分類: S/S2SH 、J2EEJ2SE
    主站蜘蛛池模板: 午夜影院免费观看| 成人A毛片免费观看网站| 亚洲av日韩av永久在线观看| 精品亚洲成a人在线观看| 成人自慰女黄网站免费大全| 小草在线看片免费人成视久网| 我的小后妈韩剧在线看免费高清版 | 亚洲色婷婷六月亚洲婷婷6月| 婷婷久久久亚洲欧洲日产国码AV| 亚洲欧洲日产国产最新| 亚洲成a人无码亚洲成av无码 | 久久精品免费一区二区喷潮| 免费va在线观看| 久久久亚洲精品无码| 精品亚洲456在线播放| 免费无码午夜福利片69| 日韩免费观看一区| 女性自慰aⅴ片高清免费| 国产精品亚洲不卡一区二区三区| 久久精品国产亚洲AV大全| 国产精品亚洲专区无码WEB | 97在线免费观看视频| 国产在线观看免费观看不卡| 亚洲精品动漫人成3d在线| 久久亚洲国产精品成人AV秋霞| 欧美日韩亚洲精品| 日韩在线永久免费播放| 国产一区二区三区在线观看免费| 亚洲av日韩av无码黑人| 亚洲精品人成网线在线播放va| 成人免费ā片在线观看| 国产精品免费观看久久| 亚洲日韩欧洲乱码AV夜夜摸| 亚洲日韩国产精品乱-久| 亚洲天堂免费在线视频| 无码精品A∨在线观看免费| 亚洲色婷婷综合久久| 久久久久亚洲精品无码网址色欲| 日本免费一区二区三区四区五六区| 国产免费观看黄AV片| 亚洲导航深夜福利|