Hibernate實(shí)體層次設(shè)計(jì)(三)

          Table per subclass:

          父類TItem單獨(dú)映射到一張主表,為子類TBook、TDVD分別單獨(dú)設(shè)立一張子表,子表中只包含子類所擴(kuò)展的屬性。同時(shí),子表通過關(guān)系型數(shù)據(jù)庫的外鍵相關(guān)聯(lián),如下圖所示:

          數(shù)據(jù)關(guān)系圖如下:


          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(
          "電子工業(yè)");
                      book1.setName(
          "Java beginner");
                      book1.setPageCount(
          501);
                      
                      TBook book2 
          = new TBook();
                      book2.setManufacturer(
          "機(jī)械工業(yè)");
                      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 閱讀(339) 評(píng)論(0)  編輯  收藏 所屬分類: 開源軟件框架

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

          導(dǎo)航

          常用鏈接

          隨筆分類(27)

          隨筆檔案(28)

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 富川| 兰西县| 喀喇沁旗| 三台县| 宁国市| 临安市| 平罗县| 永登县| 汉源县| 曲靖市| 丰宁| 广宗县| 开原市| 花莲县| 平武县| 洮南市| 岐山县| 社旗县| 东乌珠穆沁旗| 乐安县| 鄂尔多斯市| 平山县| 进贤县| 宜君县| 怀来县| 上饶县| 宣威市| 绥德县| 黔东| 肥西县| 团风县| 会理县| 连南| 东乡| 东光县| 澄城县| 潼关县| 灵武市| 信宜市| 宁化县| 通化县|