Table per class hierarchy

          前兩種方式,都要進行多表操作,這樣帶來的性能的消耗量是相當可觀的,不利于高并發量的數據存取。
          Table per class hierarchy提供了另外一中選擇。
          實際開發中,通過冗余字段表達同類型數據是很多情況下的選擇。
          建立一個數據表T_Item包含了所有商品可能用到的字段。另外,為了區分不同的商品,還需要引入一個用于區分的字段。

          1.數據表如下圖:


          2.數據表定義sql
          use?sample;
          DROP?TABLE?T_Item;

          CREATE?TABLE?T_Item?(
          ???????id?
          INT?NOT?NULL?AUTO_INCREMENT
          ?????,?category?
          VARCHAR(10)
          ?????,?name?
          VARCHAR(50)
          ?????,?manufacturer?
          VARCHAR(50)
          ?????,?regioncode?
          VARCHAR(30)
          ?????,?pagecount?
          INT
          ?????,?
          PRIMARY?KEY?(id)
          );


          3.配置文件

          TItem.hbm.xml:
          注意,discriminator定義要緊跟在id定義之后。如果在property之后定義,會報錯誤。

          (meta*,subselect?,cache?,synchronize*,comment?,tuplizer*,(id|composite-id),discriminator?,natural-id?,(version|timestamp)?,(property|many-to-one|one-to-one|component|dynamic-component|properties|any|map|set|list|bag|idbag|array|primitive-array)*,((join*,subclass*)|joined-subclass*|union-subclass*),loader?,sql-insert?,sql-update?,sql-delete?,filter*,resultset*,(query|sql-query)*)

          <?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>
          ????????
          ????????
          <discriminator?column="category"?type="string"></discriminator>
          ????????????????
          ????????
          <property?name="name"?column="name"/>
          ????????
          <property?name="manufacturer"?column="manufacturer"/>????????
          ????????
          ????????
          <subclass?name="TBook"?discriminator-value="1">
          ????????????
          <property?name="pageCount"?column="pagecount"></property>
          ????????
          </subclass>
          ????????
          ????????
          <subclass?name="TDVD"?discriminator-value="2">
          ????????????
          <property?name="regionCode"?column="regioncode"></property>
          ????????
          </subclass>????????
          ???????????????
          ????
          </class>
          </hibernate-mapping>

          4.測試代碼
          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(
          "byf");
          ????????????book1.setName(
          "Java?beginner");
          ????????????book1.setPageCount(
          501);
          ????????????
          ????????????TBook?book2?
          =?new?TBook();
          ????????????book2.setManufacturer(
          "yyy");
          ????????????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)?{
          ????????????
          //?TODO:?handle?exception
          ????????????e.printStackTrace();
          ????????????Assert.fail(e.getMessage());
          ????????????
          if(tran?!=?null)?{
          ????????????????
          try?{
          ????????????????????tran.rollback();
          ????????????????}?
          catch?(Exception?e1)?{
          ????????????????????
          //?TODO:?handle?exception
          ????????????????????e1.printStackTrace();
          ????????????????}
          ????????????}
          ????????}
          ????}
          ????

          ????
          public?void?testSelect(){
          ????????List?list?
          =?session.createQuery("?from?TBook").list();
          ????????
          ????????Iterator?it?
          =?list.iterator();
          ????????
          while?(it.hasNext())?{
          ????????????TBook?book?
          =?(TBook)it.next();
          ????????????System.out.println(book.getName());????????????
          ????????}
          ????????
          ????????list?
          =?session.createQuery("?from?TDVD").list();
          ????????it?
          =?list.iterator();
          ????????
          while?(it.hasNext())?{
          ????????????TDVD?dvd?
          =?(TDVD)it.next();
          ????????????System.out.println(dvd.getName());????????????
          ????????}????????
          ????}
          }

          4.查詢結果
          posted on 2006-07-05 15:04 knowhow 閱讀(248) 評論(0)  編輯  收藏 所屬分類: ORM:Hibernate及其他
          主站蜘蛛池模板: 柘荣县| 铜鼓县| 神农架林区| 临洮县| 辰溪县| 阳春市| 镇安县| 股票| 申扎县| 遵义县| 来宾市| 赣州市| 盖州市| 定州市| 乌鲁木齐县| 镇坪县| 通城县| 邵东县| 西和县| 淮安市| 千阳县| 太谷县| 沅陵县| 富宁县| 乐都县| 黑山县| 临颍县| 博罗县| 宁南县| 石景山区| 阜阳市| 定远县| 重庆市| 三亚市| 蓬溪县| 济宁市| 乐业县| 鄂托克前旗| 长宁区| 和顺县| 六盘水市|