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

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

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

    隨筆-124  評論-49  文章-56  trackbacks-0

    繼承映射的三種策略:
      * 單表繼承,每棵類繼承樹使用一個表
      * 具體表繼承,每個子類一個表
      * 類表繼承,每個具體類一個表
    -----------------------------------------------------------------
    每棵類繼承樹映射成一張表
    1、理解如何映射
      因為類繼承樹肯定是對應多個類,要把多個類的信息存放在一張表中,必須有某種機制來區分哪些記錄是屬于哪個類的。
     這種機制就是,在表中添加一個字段,用這個字段的值來進行區分。用hibernate實現這種策略的時候,有如下步驟:
     父類用普通的<class>標簽定義
     在父類中定義一個discriminator,即指定這個區分的字段的名稱和類型
     如:<discriminator column=”XXX” type=”string”/>
     子類使用<subclass>標簽定義,在定義subclass的時候,需要注意如下幾點:
     Subclass標簽的name屬性是子類的全路徑名
     在Subclass標簽中,用discriminator-value屬性來標明本子類的discriminator字段(用來區分不同類的字段)
     的值Subclass標簽,既可以被class標簽所包含(這種包含關系正是表明了類之間的繼承關系),也可以與class標
     簽平行。 當subclass標簽的定義與class標簽平行的時候,需要在subclass標簽中,添加extends屬性,里面的值
     是父類的全路徑名稱。子類的其它屬性,像普通類一樣,定義在subclass標簽的內部。

    2、理解如何存儲
     存儲的時候hibernate會自動將鑒別字段值插入到數據庫中,在加載數據的時候,hibernate能根據這個鑒別值
     正確的加載對象
     
    多態查詢:在hibernate加載數據的時候能鑒別出正真的類型(instanceOf)

      * get支持多態查詢
      * load只有在將<class>標簽的lazy=false,才支持多態查詢
      * hql支持多態查詢 

    <!--
      Animal:                Bird extends Animal:   Pig extends Animal:
      private int id;         private int height;        private int weight;
      private String name;
    -->
      
    <class name="Animal" table="t_animal">
            
    <id name="id">
                
    <generator class="native"/>
            
    </id>
            
    <discriminator column="type" type="string"/><!--必須在id后面,是檢別器  -->
            
    <property name="name"/>
            //subclass表示子類,discriminator-value表示檢別字段的值
            
    <subclass name="Pig" discriminator-value="P">
                
    <property name="weight"/>
            
    </subclass>
            
    <subclass name="Bird" discriminator-value="B">
                
    <property name="height"/>
            
    </subclass>
        
    </class>

    public void testSave1(){
            Session session
    =null;
            
    try{
                session
    =HibernateUtils.getSession();
                session.beginTransaction();
                
                Pig pig
    =new Pig();
                pig.setName(
    "豬八戒");
                pig.setWeight(
    100);
                session.save(pig);
                
                Bird bird
    =new Bird();
                bird.setName(
    "鳥類");
                bird.setHeight(
    50);
                session.save(bird);
                
                session.getTransaction().commit();
            }
    catch(Exception e){
                e.printStackTrace();
                session.getTransaction().rollback();
            }
    finally{
                HibernateUtils.closeSession(session);
            }

        }


        
    public void testLoda1(){
            Session session
    =null;
            
    try{
                session
    =HibernateUtils.getSession();
                session.beginTransaction();
                
                Pig p
    =(Pig)session.load(Pig.class1);
                System.out.println(p.getName());
                
                session.getTransaction().commit();
            }
    catch(Exception e){
                e.printStackTrace();
                session.getTransaction().rollback();
            }
    finally{
                HibernateUtils.closeSession(session);
            }

        }

        
        
    public void testLoda2(){
            Session session
    =null;
            
    try{
                session
    =HibernateUtils.getSession();
                session.beginTransaction();
                
                Animal a
    =(Animal)session.load(Animal.class1);
                System.out.println(a.getName());
                
                session.getTransaction().commit();
            }
    catch(Exception e){
                e.printStackTrace();
                session.getTransaction().rollback();
            }
    finally{
                HibernateUtils.closeSession(session);
            }

        }

        
        
    public void testLoda3(){
            Session session
    =null;
            
    try{
                session
    =HibernateUtils.getSession();
                session.beginTransaction();
                
                Animal a
    =(Animal)session.load(Animal.class1);
                
    //因為load默認支持lazy,我們看到的是Animal的代理對象
                
    //所以通過instanceof是反應不出正真的對象類型的
                
    //因些load在默認情況下是不支持多態查詢的
                if(a instanceof Pig){
                    System.out.println(a.getName());
                }
    else{
                    System.out.println(
    "不是");
                }

                
                session.getTransaction().commit();
            }
    catch(Exception e){
                e.printStackTrace();
                session.getTransaction().rollback();
            }
    finally{
                HibernateUtils.closeSession(session);
            }

        }

    每個子類映射成一張表

    1、理解如何映射
      這種策略是使用joined-subclass標簽來定義子類的。父類、子類,每個類都對應一張數據庫表。
     在父類對應的數據庫表中,實際上會存儲所有的記錄,包括父類和子類的記錄;在子類對應的數據庫表中,
     這個表只定義了子類中所特有的屬性映射的字段。子類與父類,通過相同的主鍵值來關聯。實現這種策略的時候,
     有如下步驟:
     父類用普通的<class>標簽定義即可
     父類不再需要定義discriminator字段
     子類用<joined-subclass>標簽定義,在定義joined-subclass的時候,需要注意如下幾點:
     Joined-subclass標簽的name屬性是子類的全路徑名
     Joined-subclass標簽需要包含一個key標簽,這個標簽指定了子類和父類之間是通過哪個字段來關聯的。
     如:<key column=”PARENT_KEY_ID”/>,這里的column,實際上就是父類的主鍵對應的映射字段名稱。
     Joined-subclass標簽,既可以被class標簽所包含(這種包含關系正是表明了類之間的繼承關系),
     也可以與class標簽平行。 當Joined-subclass標簽的定義與class標簽平行的時候,需要在Joined-subclass
     標簽中,添加extends屬性,里面的值是父類的全路徑名稱。子類的其它屬性,像普通類一樣,定義在joined-subclass標簽的內部。

    <!--
      Animal:                Bird extends Animal:   Pig extends Animal:
      private int id;         private int height;        private int weight;
      private String name;
    -->
      
    <class name="Animal" table="t_animal2">
            
    <id name="id">
                
    <generator class="native"/>
            
    </id>
            
    <property name="name"/>
            
    <joined-subclass name="Pig" table="t_pag2">
                
    <key column="pagid"/>
                
    <property name="weight"/>
            
    </joined-subclass>
            
    <joined-subclass name="Bird" table="t_bird2">
                
    <key column="birdid"/>
                
    <property name="height"/>
            
    </joined-subclass>
        
    </class>

    每個具體類映射成一張表

    1、理解如何映射
     這種策略是使用union-subclass標簽來定義子類的。每個子類對應一張表,而且這個表的信息是完備的,
     即包含了所有從父類繼承下來的屬性映射的字段(這就是它跟joined-subclass的不同之處,
     joined-subclass定義的子類的表,只包含子類特有屬性映射的字段)。實現這種策略的時候,有如下步驟:
     父類用普通<class>標簽定義即可
     子類用<union-subclass>標簽定義,在定義union-subclass的時候,需要注意如下幾點:
     Union-subclass標簽不再需要包含key標簽(與joined-subclass不同)
     Union-subclass標簽,既可以被class標簽所包含(這種包含關系正是表明了類之間的繼承關系),
     也可以與class標簽平行。 當Union-subclass標簽的定義與class標簽平行的時候,需要在Union-subclass
     標簽中,添加extends屬性,里面的值是父類的全路徑名稱。子類的其它屬性,像普通類一樣,
     定義在Union-subclass標簽的內部。這個時候,雖然在union-subclass里面定義的只有子類的屬性,
     但是因為它繼承了父類,所以,不需要定義其它的屬性,在映射到數據庫表的時候,依然包含了父類的所
     有屬性的映射字段。
     
    注意:在保存對象的時候id是不能重復的(不能使用自增生成主鍵)
       默認父類的animal表會生成,設<class>的abstract="true"就不會生成 

    <!--
      Animal:                Bird extends Animal:   Pig extends Animal:
      private int id;         private int height;        private int weight;
      private String name;
    -->
      
    <class name="Animal" abstract="true">
            
    <id name="id">
                
    <generator class="assigned"/>
            
    </id>
            
    <property name="name"/>
            
    <union-subclass name="Pig" table="t_pig3">
                
    <property name="weight"/>
            
    </union-subclass>
            
    <union-subclass name="Bird" table="t_bird3">
                
    <property name="height"/>
            
    </union-subclass>
        
    </class>
    posted on 2009-11-03 16:15 junly 閱讀(187) 評論(0)  編輯  收藏 所屬分類: hibernate/orm
    主站蜘蛛池模板: 亚洲av无码国产精品夜色午夜| 免费乱码中文字幕网站| 亚洲成A人片在线观看无码不卡| 免费高清A级毛片在线播放| 全黄a免费一级毛片人人爱| 国产精品亚洲精品爽爽| 免费一区二区三区四区五区| 美女免费视频一区二区| 波多野结衣免费视频观看| 一级中文字幕免费乱码专区| 久久亚洲国产成人精品无码区| 精品一区二区三区免费视频| 狠狠色伊人亚洲综合成人| 无码人妻丰满熟妇区免费| 亚洲精品自在线拍| 成人激情免费视频| 阿v免费在线观看| 国产午夜亚洲精品午夜鲁丝片| 三级网站免费观看| 久久亚洲春色中文字幕久久久| 3344免费播放观看视频| 亚洲精品国产电影午夜| 在线jyzzjyzz免费视频| 尤物视频在线免费观看| 久久亚洲国产精品| 成人免费无码大片A毛片抽搐| 色窝窝亚洲av网| 精品亚洲永久免费精品| 国产免费不卡视频| 日韩在线一区二区三区免费视频| 精品久久香蕉国产线看观看亚洲| 30岁的女人韩剧免费观看| 欧美亚洲国产SUV| 亚洲高清国产AV拍精品青青草原 | 人人狠狠综合久久亚洲高清| 国产精品高清免费网站| 亚洲理论片在线观看| 亚洲?v女人的天堂在线观看| 美女被cao网站免费看在线看| 亚洲日韩一区精品射精| 亚洲精品制服丝袜四区|