想飛就別怕摔

          大爺的并TM罵人

          Hibernate學習(七)---【繼承映射--每棵繼承樹映射成一張表】

           每棵繼承樹映射成一張表

          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只有在lazy=false,才支持多態查詢
          hql支持多態查詢 

          package com.bjsxt.hibernate;

          public class Animal {
              
              
          private int id;
              
              
          private String name;
              
              
          private boolean sex;

              
          public int getId() {
                  
          return id;
              }

              
          public void setId(int id) {
                  
          this.id = id;
              }

              
          public String getName() {
                  
          return name;
              }

              
          public void setName(String name) {
                  
          this.name = name;
              }

              
          public boolean isSex() {
                  
          return sex;
              }

              
          public void setSex(boolean sex) {
                  
          this.sex = sex;
              }
          }

           

          package com.bjsxt.hibernate;

          public class Bird extends Animal {

              
          private int height;

              
          public int getHeight() {
                  
          return height;
              }

              
          public void setHeight(int height) {
                  
          this.height = height;
              }
          }

           

          package com.bjsxt.hibernate;

          public class Pig extends Animal {
              
              
          private int weight;

              
          public int getWeight() {
                  
          return weight;
              }

              
          public void setWeight(int weight) {
                  
          this.weight = weight;
              }
          }

           

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC 
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
          >
          <hibernate-mapping package="com.bjsxt.hibernate">
              
          <class name="Animal" table="t_animal" lazy="false">
                  
          <id name="id">
                      
          <generator class="native"/>
                  
          </id>
                  
          <discriminator column="type" type="string"/>
                  
          <property name="name"/>
                  
          <property name="sex"/>
                  
          <subclass name="Pig" discriminator-value="P">
                      
          <property name="weight"/>
                  
          </subclass>
                  
          <subclass name="Bird" discriminator-value="B">
                      
          <property name="height"/>
                  
          </subclass>
              
          </class>
          </hibernate-mapping>

          package com.bjsxt.hibernate;

          import java.util.Iterator;
          import java.util.List;

          import org.hibernate.Session;

          import junit.framework.TestCase;

          public class ExtendsTest extends TestCase {

              
          public void testSave1() {
                  Session session 
          = null;
                  
          try {
                      session 
          = HibernateUtils.getSession();
                      session.beginTransaction();
                      
                      Pig pig 
          = new Pig();
                      pig.setName(
          "豬豬");
                      pig.setSex(
          true);
                      pig.setWeight(
          100);
                      session.save(pig);
                      
                      Bird bird 
          = new Bird();
                      bird.setName(
          "鳥鳥");
                      bird.setSex(
          false);
                      bird.setHeight(
          50);
                      session.save(bird);
                      
                      session.getTransaction().commit();
                  }
          catch(Exception e) {
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally {
                      HibernateUtils.closeSession(session);
                  }
              }    
              
              
          /**
               * 采用load,通過Pig查詢
               
          */
              
          public void testLoad1() {
                  Session session 
          = null;
                  
          try {
                      session 
          = HibernateUtils.getSession();
                      session.beginTransaction();
                      
                      Pig pig 
          = (Pig)session.load(Pig.class1);
                      System.out.println(pig.getName());
                      
                      session.getTransaction().commit();
                  }
          catch(Exception e) {
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally {
                      HibernateUtils.closeSession(session);
                  }
              }
              
              
          /**
               * 采用load,通過Animal查詢
               
          */
              
          public void testLoad2() {
                  Session session 
          = null;
                  
          try {
                      session 
          = HibernateUtils.getSession();
                      session.beginTransaction();
                      
                      Animal animal 
          = (Animal)session.load(Animal.class1);
                      System.out.println(animal.getName());
                      
                      session.getTransaction().commit();
                  }
          catch(Exception e) {
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally {
                      HibernateUtils.closeSession(session);
                  }
              }            
              
              
          /**
               * 采用load,通過Animal查詢
               
          */
              
          public void testLoad3() {
                  Session session 
          = null;
                  
          try {
                      session 
          = HibernateUtils.getSession();
                      session.beginTransaction();
                      
                      Animal animal 
          = (Animal)session.load(Animal.class1);
                      
                      
          //因為load默認只是lazy,因為我們看到的是Animal的代理對象
                      
          //所以通過instanceof是反應不出正真的對象類型的
                      
          //因此load在默認情況下是不支持多態查詢的
                      if (animal instanceof Pig) {
                          System.out.println(animal.getName());
                      }
          else {
                          System.out.println(
          "不是豬");
                      }
                      session.getTransaction().commit();
                  }
          catch(Exception e) {
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally {
                      HibernateUtils.closeSession(session);
                  }
              }            
              
              
          /**
               * 采用load,通過Animal查詢,將<class>標簽上的lazy=false
               
          */
              
          public void testLoad4() {
                  Session session 
          = null;
                  
          try {
                      session 
          = HibernateUtils.getSession();
                      session.beginTransaction();
                      
                      Animal animal 
          = (Animal)session.load(Animal.class1);
                      
          //可以正確的判斷出Pig的類型,因為lazy=false,返回的是具體的Pig類型
                      
          //此時load支持多態查詢
                      if (animal instanceof Pig) {
                          System.out.println(animal.getName());
                      }
          else {
                          System.out.println(
          "不是豬");
                      }
                      session.getTransaction().commit();
                  }
          catch(Exception e) {
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally {
                      HibernateUtils.closeSession(session);
                  }
              }        
              
              
          /**
               * 采用get,通過Animal查詢
               
          */
              
          public void testLoad5() {
                  Session session 
          = null;
                  
          try {
                      session 
          = HibernateUtils.getSession();
                      session.beginTransaction();
                      
                      
          //可以正確的判斷出Pig的類型,因為返回的是具體的Pig類型
                      
          //get支持多態查詢
                      Animal animal = (Animal)session.get(Animal.class1);

                      
          if (animal instanceof Pig) {
                          System.out.println(animal.getName());
                      }
          else {
                          System.out.println(
          "不是豬");
                      }
                      session.getTransaction().commit();
                  }
          catch(Exception e) {
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally {
                      HibernateUtils.closeSession(session);
                  }
              }    
              
              
          /**
               * 采用get,通過Animal查詢
               
          */
              
          public void testLoad6() {
                  Session session 
          = null;
                  
          try {
                      session 
          = HibernateUtils.getSession();
                      session.beginTransaction();
          //            List animalList = session.createQuery("from Animal").list();
          //            for (Iterator iter = animalList.iterator(); iter.hasNext();) {
          //                Animal a = (Animal)iter.next();
          //                //能夠正確的鑒別出正真的類型,hql是支持多態查詢的
          //                if (a instanceof Pig) {
          //                    System.out.println("是Pig");
          //                }else if (a instanceof Bird) {
          //                    System.out.println("是bird");
          //                } 
          //            }
                      
                      List list 
          = session.createQuery("from java.lang.Object").list();
                      
          for (Iterator iter=list.iterator(); iter.hasNext();) {
                          Object o 
          = iter.next();
                          
          if (o instanceof Pig) {
                              System.out.println(
          "是Pig");
                          }
          else if (o instanceof Bird) {
                              System.out.println(
          "是bird");
                          } 
                      }
                      session.getTransaction().commit();
                  }
          catch(Exception e) {
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally {
                      HibernateUtils.closeSession(session);
                  }
              }    
              
          }

          posted on 2009-11-01 18:45 生命的綻放 閱讀(326) 評論(0)  編輯  收藏 所屬分類: Hibernate

          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(5)

          隨筆分類(94)

          隨筆檔案(93)

          文章分類(5)

          文章檔案(5)

          相冊

          JAVA之橋

          SQL之音

          兄弟之窗

          常用工具下載

          積分與排名

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 岫岩| 上高县| 准格尔旗| 乌审旗| 毕节市| 寿光市| 新巴尔虎右旗| 霍城县| 青冈县| 河池市| 大冶市| 大连市| 南康市| 义乌市| 丰顺县| 张家界市| 甘谷县| 柯坪县| 广河县| 清涧县| 长寿区| 永丰县| 友谊县| 西宁市| 珠海市| 宽城| 浦城县| 伊宁县| 铁力市| 凤庆县| 郎溪县| 南充市| 穆棱市| 淮滨县| 石柱| 拜泉县| 新乡县| 田东县| 白城市| 资溪县| 婺源县|