Hibernate實體層次設計(三)

          Table per subclass:

          父類TItem單獨映射到一張主表,為子類TBook、TDVD分別單獨設立一張子表,子表中只包含子類所擴展的屬性。同時,子表通過關系型數據庫的外鍵相關聯,如下圖所示:

          數據關系圖如下:


          1.表定義sql如下
          use sample;

          DROP TABLE T_DVD;
          DROP TABLE T_Book;
          DROP TABLE T_Item;

          CREATE TABLE T_Item (
                 id 
          INT NOT NULL AUTO_INCREMENT
               , name 
          VARCHAR(50)
               , manufacturer 
          VARCHAR(50)
               , 
          PRIMARY KEY (id)
          );

          CREATE TABLE T_Book (
                 id 
          INT NOT NULL
               , pagecount 
          INT
               , 
          PRIMARY KEY (id)
               , 
          INDEX (id)
               , 
          CONSTRAINT FK_T_Book_1 FOREIGN KEY (id)
                            
          REFERENCES T_Item (id)
          );

          CREATE TABLE T_DVD (
                 id 
          INT NOT NULL
               , regioncode 
          VARCHAR(30)
               , 
          PRIMARY KEY (id)
               , 
          INDEX (id)
               , 
          CONSTRAINT FK_T_DVD_1 FOREIGN KEY (id)
                            
          REFERENCES T_Item (id)
          );


          2.配置文件
          TItem.hbm.xml
          <?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="cn.blogjava.start">

              
          <class name="TItem" table="T_Item" catalog="sample">
                  
          <id name="id" column="id">
                      
          <generator class="native" />
                  
          </id>
                  
          <property name="name" column="name"/>
                  
          <property name="manufacturer" column="manufacturer"/>        
                  
                  
          <joined-subclass name="TDVD" table="T_DVD" catalog="sample">
                      
          <key column="id" />
                      
          <property name="regionCode" column="regioncode" />
                  
          </joined-subclass>
                  
                  
          <joined-subclass name="TBook" table="T_Book" catalog="sample">
                      
          <key column="id" />
                      
          <property name="pageCount" column="pagecount" />
                  
          </joined-subclass>
                         
              
          </class>
          </hibernate-mapping>

          3.測試代碼。
          package cn.blogjava.start;

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

          import junit.framework.Assert;
          import junit.framework.TestCase;

          import org.hibernate.HibernateException;
          import org.hibernate.Session;
          import org.hibernate.SessionFactory;
          import org.hibernate.Transaction;
          import org.hibernate.cfg.Configuration;


          public class HibernateTest extends TestCase {
              
              Session session 
          = null;

              
          protected void setUp() {
                  
          try {
                      Configuration config = new Configuration().configure();
                      SessionFactory sessionFactory 
          = config.buildSessionFactory();
                      session 
          = sessionFactory.openSession();
                      
                  } 
          catch (HibernateException e) {
                      e.printStackTrace();
                  }        
              }

              protected void tearDown() {
                  
          try {
                      session.close();        
                  } 
          catch (HibernateException e) {
                      e.printStackTrace();
                  }        
              }    
              
            
              
          public void testInsert() {
                  Transaction tran 
          = null;
                  
          try {
                      tran 
          = session.beginTransaction();
                      TBook book1 
          = new TBook();
                      
                      book1.setManufacturer(
          "電子工業");
                      book1.setName(
          "Java beginner");
                      book1.setPageCount(
          501);
                      
                      TBook book2 
          = new TBook();
                      book2.setManufacturer(
          "機械工業");
                      book2.setName(
          "Thinking in java");
                      book2.setPageCount(
          1201);
                      
                      TDVD dvd1 
          = new TDVD();
                      dvd1.setManufacturer(
          "columnibia");
                      dvd1.setName(
          "Lord king");
                      dvd1.setRegionCode(
          "5 area");
                      
                      TDVD dvd2 
          = new TDVD();
                      dvd2.setManufacturer(
          "sony");
                      dvd2.setName(
          "Forrest gump");
                      dvd2.setRegionCode(
          "3 area");            

                      session.save(book1);
                      session.save(book2);
                      session.save(dvd1);
                      session.save(dvd2);
                      session.flush();
                      tran.commit();
                      Assert.assertEquals(book1.getId().intValue()
          >0true);
                      Assert.assertEquals(book2.getId().intValue()
          >0true);
                      Assert.assertEquals(dvd1.getId().intValue()
          >0true);
                      Assert.assertEquals(dvd2.getId().intValue()
          >0true);
                  } 
          catch (HibernateException e) {
                      e.printStackTrace();
                      Assert.fail(e.getMessage());
                      
          if(tran != null) {
                          
          try {
                              tran.rollback();
                          } 
          catch (Exception e1) {
                              e1.printStackTrace();
                          }
                      }
                  }
              }
              
              public void testSelect(){
                  List list 
          = session.createQuery(" from TItem").list();
                  
                  Iterator it 
          = list.iterator();
                  
          while (it.hasNext()) {
                      TItem item 
          = (TItem)it.next();
                      System.out.println(item.getName());
                      
                  }
              }
          }

          4.在HQL Scratchpad中輸入 From TItem,在Hibernate Dynamic Query Translator中觀察到如下的SQL語句:
          select
            titem0_.id 
          as id16_,
            titem0_.name 
          as name16_,
            titem0_.manufacturer 
          as manufact3_16_,
            titem0_1_.regioncode 
          as regioncode17_,
            titem0_2_.pagecount 
          as pagecount18_,
            
          case 
             
          when titem0_1_.id is not null then 1 
             
          when titem0_2_.id is not null then 2 
             
          when titem0_.id is not null then 0 
            
          end as clazz_ 
           
          from
            sample.T_Item titem0_ 
           
          left outer join
            sample.T_DVD titem0_1_ 
             
          on titem0_.id=titem0_1_.id 
           
          left outer join
            sample.T_Book titem0_2_ 
             
          on titem0_.id=titem0_2_.id

          posted on 2006-07-02 17:39 baim 閱讀(340) 評論(0)  編輯  收藏 所屬分類: 開源軟件框架

          <2006年7月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導航

          常用鏈接

          隨筆分類(27)

          隨筆檔案(28)

          搜索

          最新評論

          主站蜘蛛池模板: 昭觉县| 孙吴县| 济宁市| 林芝县| 福建省| 平泉县| 青州市| 大新县| 雷波县| 湘潭市| 丰城市| 徐州市| 余姚市| 潞城市| 简阳市| 仙游县| 德钦县| 连云港市| 论坛| 玉林市| 昌图县| 茶陵县| 中卫市| 大连市| 宁陵县| 永兴县| 息烽县| 松潘县| 兰州市| 韩城市| 安塞县| 泽州县| 隆林| 泊头市| 卓尼县| 甘肃省| 防城港市| 名山县| 长乐市| 涟水县| 杭锦后旗|