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()
          >0,?true);
          ????????????Assert.assertEquals(book2.getId().intValue()
          >0,?true);
          ????????????Assert.assertEquals(dvd1.getId().intValue()
          >0,?true);
          ????????????Assert.assertEquals(dvd2.getId().intValue()
          >0,?true);
          ????????}?
          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-05 15:02 knowhow 閱讀(260) 評論(0)  編輯  收藏 所屬分類: ORM:Hibernate及其他
          主站蜘蛛池模板: 来宾市| 马龙县| 涿州市| 博罗县| 绥德县| 进贤县| 雅安市| 黎城县| 龙门县| 镇赉县| 乐平市| 永清县| 铜川市| 聊城市| 保德县| 德江县| 许昌县| 长沙市| 永福县| 右玉县| 砀山县| 来宾市| 白银市| 于都县| 宜州市| 巴林左旗| 龙门县| 五家渠市| 灵石县| 五台县| 清原| 图们市| 金门县| 方城县| 宣城市| 临安市| 五常市| 白玉县| 梓潼县| 萍乡市| 黔西|