blogjava's web log

          blogjava's web log
          ...

          hibernate繼承之---subclass 已更新(四)

          先看由滿江紅翻譯團隊(RedSaga Translate Team)翻譯的子類(subclass)說明,再來看我們的例子
          多態持久化需要為父類的每個子類都進行定義。對于“每一棵類繼承樹對應一個表”的策略來說,就需要使用<subclass>定義。
          <subclass
                  name="ClassName"                              (1)
                  discriminator-value="discriminator_value"     (2)
                  proxy="ProxyInterface"                        (3)
                  lazy="true|false"                             (4)
                  dynamic-update="true|false"
                  dynamic-insert="true|false"
                  entity-name="EntityName"
                  node="element-name">
                  <property .... />
                  .....
          </subclass>
          (1)

          name: 子類的全限定名。

          (2)

          discriminator-value(辨別標志) (可選 - 默認為類名):一個用于區分每個獨立的子類的值。

          (3)

          proxy(代理) (可選): 指定一個類或者接口,在延遲裝載時作為代理使用。

          (4)

          lazy (可選, 默認是true): 設置為 lazy="false" 禁止使用延遲抓取

          每個子類都應該定義它自己的持久化屬性和子類。 <version><id> 屬性可以從根父類繼承下來。在一棵繼承樹上的每個子類都必須定義一個唯一的discriminator-value。如果沒有指定,就會使用Java類的全限定名。

          可以在單獨的映射文件中,直接在hibernate-mapping下定義subclassunion-subclassjoined-subclass映射。這樣你只要增加一個新的映射文件就可以繼承一棵類繼承樹。你必須在子類的映射中指定extends 屬性來指定已映射的超類。注意:以前,這個特性使得映射文件的順序變得很重要。從Hibernate3開始,當使用extends關鍵字的時候,映射文件的次序便不重要了。而在單一映射文件中,依舊需要保持將超類定義在子類之前這樣的次序。

          <hibernate-mapping>
              <subclass name="DomesticCat" extends="Cat" discriminator-value="D">
                   <property name="name" type="string"/>
              </subclass>
          </hibernate-mapping>

          好了。。

          開始看例子了。。

          建表
          create?table?animal
          (aid?varchar(
          32)?not?null?primary?key,
          ?atype?varchar(
          16),
          ?dname?varchar(
          16),
          ?cname?varchar(
          16)
          )

          父類
          package?com.test;

          public?class?Animal
          {
          ????
          private?String?aid;
          ???
          //geter?seter
          Cat
          package?com.test;

          public?class?Cat?extends?Animal
          {
          ????
          private?String?cname;
          ??
          //geter?seter

          Dog
          package?com.test;

          public?class?Dog?extends?Animal
          {
          ????
          private?String?dname;
          ???
          //geter?seter

          配置文件。。精華在這了.
          <?xml?version="1.0"?>
          <!DOCTYPE?hibernate-mapping
          ????PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD//EN"
          ????"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
          >

          <hibernate-mapping>

          ????
          <class?name="com.test.Animal"?table="animal">??

          ????????
          <id?name="aid"?type="string"?unsaved-value="null"?>
          ????????????
          <column?name="aid"?sql-type="char(32)"?not-null="true"/>
          ????????????
          <generator?class="uuid.hex"/>
          ????????
          </id>

          ????????
          <discriminator?column="atype"?type="string"?/>
          ????????
          ????????
          <subclass?name="com.test.Dog"?discriminator-value="dog">
          ????????????
          <property?name="dname">
          ????????????????
          <column?name="dname"?sql-type="varchar(16)"?/>
          ????????????
          </property>
          ????????
          </subclass>

          ????????
          <subclass?name="com.test.Cat"?discriminator-value="cat">
          ????????????
          <property?name="cname">
          ????????????????
          <column?name="cname"?sql-type="varchar(16)"/>
          ????????????
          </property>
          ????????
          </subclass>

          ????
          </class>

          </hibernate-mapping>

          測試類
          package?com.test;

          import?net.sf.hibernate.Session;
          import?net.sf.hibernate.SessionFactory;
          import?net.sf.hibernate.cfg.Configuration;
          import?net.sf.hibernate.*;
          import?java.sql.*;
          import?java.util.List;
          import?java.util.Iterator;

          public?class?TestInherit
          {
          ????SessionFactory?sf;
          ????Session?session;
          ????
          public?TestInherit()
          ????
          {
          ????????
          try
          ????????
          {
          ????????????Configuration?cfg?
          =?new?Configuration();
          ????????????sf?
          =?cfg.addClass(Animal.class).buildSessionFactory();
          ????????}

          ????????
          catch(HibernateException?ex)
          ????????
          {
          ????????????ex.printStackTrace();
          ????????}

          ????}

          ????
          //插入
          ????public?void?doCreate()
          ????
          {
          ????????
          try
          ????????
          {
          ????????????session?
          =?sf.openSession();

          ????????????Dog?dog?
          =?new?Dog();
          ????????????dog.setDname(
          "small?dog");
          ????????????Cat?cat?
          =?new?Cat();
          ????????????cat.setCname(
          "small?cat");
          ????????????session.save(dog);
          ????????????session.save(cat);
          ????????????session.flush();
          ????????????session.connection().commit();

          ????????}

          ????????
          catch(HibernateException?ex)
          ????????
          {
          ????????????ex.printStackTrace();
          ????????}

          ????????
          catch(SQLException?ex1)
          ????????
          {
          ????????????ex1.printStackTrace();
          ????????}

          ????????
          finally
          ????????
          {
          ????????????????
          try{
          ????????????????????session.close();
          ????????????????}

          ????????????????
          catch(HibernateException?ex2){
          ????????????????}

          ????????}


          ????}

          ????
          //查詢
          ????public?void?doQuery()
          ????
          {
          ????????
          try{
          ????????????session?
          =?sf.openSession();
          ????????????Query?q?
          =?session.createQuery("select?d?from?Dog?as?d");
          ????????????List?l?
          =?q.list();
          ????????????Dog?dog?
          =?null;
          ????????????Cat?cat?
          =?null;
          ????????????
          for(int?i=0;i<l.size();i++)
          ????????????
          {
          ????????????????dog?
          =?(Dog)l.get(i);
          ????????????????System.out.println(dog.getDname());
          ????????????}

          ????????}

          ????????
          catch(HibernateException?ex){
          ????????????ex.printStackTrace();
          ????????}

          ????????
          finally{
          ????????????
          try{
          ????????????????session.close();
          ????????????}

          ????????????
          catch(HibernateException?ex2){
          ????????????}

          ????????}

          ????}

          ????
          public?static?void?main(String[]?args)
          ????
          {
          ????????TestInherit?t?
          =?new?TestInherit();
          ????????
          //t.doCreate();
          ????????t.doQuery();
          ????}

          }


          posted on 2006-04-09 00:18 record java and net 閱讀(2250) 評論(1)  編輯  收藏 所屬分類: java

          評論

          # re: hibernate繼承之一張表---方便以后查看(四) 2006-04-09 14:17 leifei

          不錯啊。。支持。。。

          吳某人 多指點。。。

            回復  更多評論   

          導航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動態語言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 隆林| 延吉市| 库车县| 怀集县| 济阳县| 三河市| 唐海县| 太仓市| 青海省| 南岸区| 比如县| 冕宁县| 淄博市| 南澳县| 高州市| 奉新县| 北安市| 武乡县| 文山县| 革吉县| 内江市| 祁门县| 定结县| 宜都市| 奎屯市| 咸阳市| 临海市| 米泉市| 寿宁县| 海晏县| 紫金县| 卓尼县| 乌拉特前旗| 汉中市| 大同市| 芜湖市| 吉林市| 杭州市| 牙克石市| 绥化市| 司法|