posts - 14,  comments - 8,  trackbacks - 0

          這部分的內(nèi)容基本與Hibernate一致.JPA同樣支持3種類型的繼承形式:

          1.Single Table Strategy ,單表策略,一張表包含基類與子類的所有數(shù)據(jù),很多情況下都是采用這樣的冗余設(shè)計,通過一個discriminator來區(qū)分

          2.Table Per Class Strategy ,每個子類對應(yīng)一張表,每張表都擁有基類的屬性

          3.Join Strategy ,仍然是每個子類對應(yīng)一張表,但此表中不包含基類的屬性,僅僅是此子類的擴展屬性,共享基類的屬性

          以一個例子來說明3種情況:

          一.單表策略

          比如Pet作為基類,Cat和Dog繼承此類并擁有自己的擴展屬性,如:

          package com.denny_blue.ejb3.inheritance;

          import java.io.Serializable;

          import javax.persistence.DiscriminatorColumn;
          import javax.persistence.DiscriminatorType;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.Inheritance;
          import javax.persistence.InheritanceType;

          @Entity
          @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
          @DiscriminatorColumn(name = "animal_type", discriminatorType = DiscriminatorType.STRING)
          public class Pet implements Serializable {
           private int id;

           private String name;

           private double weight;

           public Pet() {
           }

           @Id
           @GeneratedValue(strategy = GenerationType.AUTO)
           public int getId() {
            return id;
           }

           public void setId(int id) {
            this.id = id;
           }

           public String getName() {
            return name;
           }

           public void setName(String name) {
            this.name = name;
           }

           public double getWeight() {
            return weight;
           }

           public void setWeight(double weight) {
            this.weight = weight;
           }

          }

          Pet類值的注意的就是通過@Inheritance(strategy = InheritanceType.SINGLE_TABLE)確定采用單表策略,通過@DiscriminatorColumn確定了標志值的字段和類型,我想熟悉hibernate的朋友對這些都應(yīng)該很熟悉.然后是兩個子類:

          //Cat.java

          package com.denny_blue.ejb3.inheritance;

          import javax.persistence.DiscriminatorColumn;
          import javax.persistence.DiscriminatorType;
          import javax.persistence.DiscriminatorValue;
          import javax.persistence.Entity;
          import javax.persistence.Inheritance;
          import javax.persistence.InheritanceType;

          @Entity
          @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
          @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
          @DiscriminatorValue("cat")
          public class Cat extends Pet {
           private String HairBall;

           public String getHairBall() {
            return HairBall;
           }

           public void setHairBall(String hairBall) {
            HairBall = hairBall;
           }

          }

          //Dog.java

          package com.denny_blue.ejb3.inheritance;

          import javax.persistence.DiscriminatorColumn;
          import javax.persistence.DiscriminatorType;
          import javax.persistence.DiscriminatorValue;
          import javax.persistence.Entity;
          import javax.persistence.Inheritance;
          import javax.persistence.InheritanceType;

          @Entity
          @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
          @DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING)
          @DiscriminatorValue("dog")
          public class Dog extends Pet {
           private String trick;

           public String getTrick() {
            return trick;
           }

           public void setTrick(String trick) {
            this.trick = trick;
           }

          }

          兩個子類最值的關(guān)注的就是@DiscriminatorValue注釋,比如Cat的此值為cat,意味著當Cat類型的Entity存入數(shù)據(jù)庫時,JPA將自動把cat的值賦給animal_type字段,Dog的值則為dog,由此就可以在同一張表中區(qū)分開兩個不同的子類.

          二.Table per Class

          采用Table Per Class策略的話,每個子類都將單獨建表,并且都獨立擁有基類中的所有屬性,互相之間不共享,在我們的例子中所要進行的修改很小,像這樣:

          //基類

          @Entity
          @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
          public class Pet implements Serializable {
           private int id;

           private String name;

           private double weight;

          ........

          //子類:不需要任何設(shè)置

          @Entity
          public class Dog extends Pet {
           private String trick;

            .......

            .......

          三.Join策略

          每個子類同樣獨立建表,基類也獨立建表,只不過所有的子類的表中只有擴展屬性,他們共享基類的表,在我們的例子中修改下即可:

          //基類

          @Entity
          @Inheritance(strategy = InheritanceType.JOINED)
          public class Pet implements Serializable {
           private int id;

           private String name;

           private double weight;

            ........

          //子類

          @Entity

          @Inheritance(strategy = InheritanceType.JOINED)
          public class Dog extends Pet {
           private String trick;

            .......

            .......

          這部分的內(nèi)容實在沒什么新意,與hibernate完全一致.JAVA EE5向spring和hibernate借鑒了太多東西.
          {}

          posted on 2008-04-21 11:20 虎嘯龍吟 閱讀(326) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊

          友情鏈接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 建宁县| 本溪| 慈利县| 淄博市| 河曲县| 黄浦区| 宿迁市| 黄骅市| 云阳县| 山阴县| 太谷县| 霍城县| 禹城市| 呼伦贝尔市| 安西县| 汉中市| 齐河县| 黄骅市| 金秀| 牡丹江市| 监利县| 城口县| 青岛市| 新竹市| 岳普湖县| 尚志市| 兴城市| 台州市| 弋阳县| 临泉县| 外汇| 中宁县| 会理县| 安吉县| 海兴县| 桦甸市| 龙陵县| 榆中县| 重庆市| 常熟市| 耒阳市|