<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
    主站蜘蛛池模板: 免费亚洲视频在线观看| 最近中文字幕免费完整| 国产乱弄免费视频| 国产精品亚洲综合天堂夜夜| 黑人粗长大战亚洲女2021国产精品成人免费视频 | a级毛片免费播放| 亚洲精品无码专区2| 亚洲日韩国产二区无码 | 男女污污污超污视频免费在线看| 国产99视频精品免费视频7| 疯狂做受xxxx高潮视频免费| 国产三级电影免费观看| 一级毛片**免费看试看20分钟| JLZZJLZZ亚洲乱熟无码| 久草免费福利视频| 亚洲最大的视频网站| 免费av欧美国产在钱| 欧洲亚洲综合一区二区三区| 亚洲国产精品一区二区第一页免 | 无码免费一区二区三区免费播放| 亚洲综合亚洲国产尤物| 成人午夜视频免费| 免费人成网上在线观看| 国产AV无码专区亚洲精品| 100000免费啪啪18免进| 狼人大香伊蕉国产WWW亚洲| 国产亚洲大尺度无码无码专线 | 亚洲精品无码久久久久久久| 99久久这里只精品国产免费| 精品在线免费视频| 亚洲国产第一站精品蜜芽| 久久99九九国产免费看小说| 黄色三级三级三级免费看| 久久亚洲国产精品| 成年人网站在线免费观看| 国产精品青草视频免费播放| 亚洲美女中文字幕| 亚洲国产av一区二区三区| 成人免费在线看片| 一个人看的免费高清视频日本| 免费爱爱的视频太爽了|