posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          EJB學(xué)習(xí)日記(18)

          Posted on 2007-10-12 10:48 semovy 閱讀(265) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): EJB
          繼承映射策略之----每個(gè)具體類(lèi)一張表

          昨天我們看了繼承關(guān)系中的實(shí)現(xiàn),昨天是用一張表保存所有級(jí)別的類(lèi),今天我們來(lái)了解一下第二種實(shí)現(xiàn)方法,每一個(gè)類(lèi)一個(gè)單獨(dú)的表的實(shí)現(xiàn),在數(shù)據(jù)庫(kù)我們的例子表現(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的最大的不同就是這些表里面沒(méi)有了辨別器這一列了,我們不再需要為每一個(gè)特定的類(lèi)設(shè)定一個(gè)標(biāo)志以識(shí)別它是哪個(gè)具體的類(lèi)了。在這種方式的實(shí)現(xiàn)里,每一張表都保存了該類(lèi)的所有的屬性,當(dāng)然也包括它從父類(lèi)中繼承過(guò)來(lái)的屬性。我們看看代碼吧:

          @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,并且這個(gè)注釋僅僅是用在基類(lèi)Person上面而已,在他的子類(lèi)中,根本看不出來(lái)有什么不一樣,它們就像一個(gè)很普通的實(shí)體BEAN一樣。

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

          主站蜘蛛池模板: 万宁市| 鄂伦春自治旗| 东明县| 永安市| 任丘市| 广丰县| 冀州市| 磴口县| 白银市| 广平县| 平安县| 彭阳县| SHOW| 垦利县| 巴彦县| 阳泉市| 宾阳县| 宁远县| 绥宁县| 阜康市| 中山市| 永新县| 沧州市| 思南县| 永吉县| 红安县| 南京市| 泸西县| 宁晋县| 郑州市| 顺义区| 沂南县| 施秉县| 吉林市| 尚志市| 尤溪县| 沂水县| 峡江县| 迭部县| 新余市| 会理县|