posts - 14,  comments - 8,  trackbacks - 0

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

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

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

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

          以一個例子來說明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的朋友對這些都應該很熟悉.然后是兩個子類:

          //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;
           }

          }

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

          二.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;

          ........

          //子類:不需要任何設置

          @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;

            .......

            .......

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

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

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


          網站導航:
           
          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊

          友情鏈接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遂昌县| 麦盖提县| 铁力市| 普洱| 和田市| 京山县| 普兰店市| 香格里拉县| 射阳县| 普宁市| 隆德县| 和平区| 博野县| 三河市| 奉贤区| 德安县| 苏尼特右旗| 崇义县| 西峡县| 永济市| 甘南县| 富裕县| 和政县| 民乐县| 沁阳市| 密山市| 平昌县| 西乌珠穆沁旗| 定日县| 苏尼特右旗| 黔东| 临朐县| 大竹县| 红桥区| 奉化市| 虞城县| 北流市| 平塘县| 织金县| 亚东县| 德阳市|