千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          盡管千里冰封
          依然擁有晴空

           

          留言簿(204)

          隨筆分類(197)

          隨筆檔案(189)

          文章檔案(2)

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 964730
          • 排名 - 35

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          繼承映射策略之----每個具體類一張表

          昨天我們看了繼承關(guān)系中的實(shí)現(xiàn),昨天是用一張表保存所有級別的類,今天我們來了解一下第二種實(shí)現(xiàn)方法,每一個類一個單獨(dú)的表的實(shí)現(xiàn),在數(shù)據(jù)庫我們的例子表現(xiàn)如下:

          create table Person (
             id 
          integer primary key not null,
             firstName 
          varchar(255),
             lastName 
          varchar(255),
          );

          create table Customer (
             id 
          integer primary key not null,
             firstName 
          varchar(255),
             lastName 
          varchar(255),
             street 
          varchar(255),
             city 
          varchar(255),
             state 
          varchar(255),
             zip 
          varchar(255),
          );

          create table Employee (
             id 
          integer primary key not null,
             firstName 
          varchar(255),
             lastName 
          varchar(255),
             street 
          varchar(255),
             city 
          varchar(255),
             state 
          varchar(255),
             zip 
          varchar(255),
             employeeId 
          integer,
          );

          此種方式和SINGLE_TABLE的最大的不同就是這些表里面沒有了辨別器這一列了,我們不再需要為每一個特定的類設(shè)定一個標(biāo)志以識別它是哪個具體的類了。在這種方式的實(shí)現(xiàn)里,每一張表都保存了該類的所有的屬性,當(dāng)然也包括它從父類中繼承過來的屬性。我們看看代碼吧:

          @Entity
          @Inheritance(strategy
          =InheritanceType 
          .TABLE_PER_CLASS)
           

          public class Person {

          }

          @Entity
          public class Customer extends Person {

          }

          @Entity
          public class Employee extends Customer {

          }

          從以上代碼可以看出,唯一需要的元數(shù)據(jù)注釋只有InheritanceType,并且這個注釋僅僅是用在基類Person上面而已,在他的子類中,根本看不出來有什么不一樣,它們就像一個很普通的實(shí)體BEAN一樣。

          優(yōu)點(diǎn):
          相比于SINGLE_TABLE的映射策略來說,此策略的優(yōu)點(diǎn)是你可以在每一個子類上定義一些屬性的約束,比方說某些屬性不能為null等等,這些都是可以定義的,但是你在SINGLE_TABLE里面卻是不能定義的,它還有一個優(yōu)點(diǎn)就是,它對于處理那些遺留的數(shù)據(jù)庫來說更加的容易一些,因?yàn)樗`活一些。
          缺點(diǎn):
          此策略依然是不規(guī)范的,沒有做到物盡其用,因?yàn)樗鼮槊恳粋€子類都重復(fù)定義了很多列,這勢必給數(shù)據(jù)庫的資源造成了浪費(fèi),當(dāng)需要進(jìn)行多態(tài)加載的時候,就會進(jìn)行多次查詢,這樣也會降低數(shù)據(jù)庫的查詢效率,這樣比較起來就沒有SINGLE_TABLE 策略速度快,但是它在別的方面性能會好一些,在開發(fā)你的實(shí)體BEAN的時候,最好不要用這種策略,除非你不得不這樣做,否則還是用第三種策略來得更好一些,那第三種策略是怎樣實(shí)現(xiàn)的呢,我們下次再講。




          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-10-09 00:21 千里冰封 閱讀(942) 評論(0)  編輯  收藏 所屬分類: JAVAEE
          主站蜘蛛池模板: 华池县| 咸阳市| 万年县| 新乡市| 临西县| 曲阳县| 芦溪县| 康马县| 高州市| 长兴县| 金昌市| 四子王旗| 乌拉特后旗| 宜兰市| 玉门市| 康乐县| 通州市| 浦北县| 弥勒县| 大兴区| 永州市| 潮州市| 三原县| 大竹县| 凌云县| 盐津县| 惠东县| 巴东县| 界首市| 崇明县| 廊坊市| 安西县| 曲靖市| 京山县| 浦城县| 皋兰县| 大名县| 河源市| 兴仁县| 新巴尔虎右旗| 汾西县|