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

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

          Posted on 2007-10-12 11:06 semovy 閱讀(304) 評論(0)  編輯  收藏 所屬分類: EJB

          非實體的基類映射

          最近我們都說了很多繼承方面的映射策略,可是有時候我們卻需要繼承一個非實體的類,這個類存在于我們的工程項目中,但是我們又不希望它成為一個實體類,這個時候怎么辦呢?這個時候我們可以用@javax.persistence.MappedSuperclass來注釋它,我們現(xiàn)在就修改一下我們前幾天的例子,把Person類定義成一個不持久化的類。代碼如下:

           

          @MappedSuperclass
          public class Person {
             @Id @GeneratedValue
             
          public int getId( ) { return id; }
             
          public void setId(int id) { this.id = is; }

             
          public String getFirstName( ) { return firstName; }
             
          public void setFirstName(String first) { this.firstName = first; }

             
          public String getLastName( ) { return lastName; }
             
          public void setLastName(String last) { this.lastName = last; }
          }

          @Entity
          @Table(name
          ="CUSTOMER")
          @Inheritance(strategy
          =InheritanceType.JOINED)
          @AttributeOverride(name
          ="lastname", column=@Column(name="SURNAME"))
          public class Customer extends Person {

          }

          @Entity
          @Table(name
          ="EMPLOYEE")
          @PrimaryKeyJoinColumn(name
          ="EMP_PK")
          public class Employee extends Customer {

          }

           

          因為Person已經(jīng)不是一個實體類了,所以在數(shù)據(jù)庫里面將沒有它所對應(yīng)的表,所有的子類都繼承了定義在它里面的屬性,當然,如果你想在子類里面重新定義在父類里面定義過的屬性的時候,你可以用@javax.persistence.AttributeOverride來聲明,當我們的代碼運行以后,將會在數(shù)據(jù)庫里面建立如下的結(jié)構(gòu):

           

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

          create table EMPLOYEE (
             EMP_PK 
          integer primary key not null,
             employeeId 
          integer
          );

           


          就像你看到的,Customer類繼承了Person里面的id,firstName ,lastName這些屬性,因為用了@AttributeOverride來指定重寫的屬性,所以在數(shù)據(jù)庫里面lastName對應(yīng)的列就變成了SURNAME.像這種映射方法在你不想強制你的超類持久化的時候特別有用。

          @MappedSuperclass不僅可以注釋在基類上面,你也可以注釋在兩個層次的實體類中間,當然,你也可以不加任何注釋,不過,當你什么注釋都不加的時候,持久化管理器就會完全忽略你的這個類了。

          個人還是覺得要映射的時候,寫清楚更好一些,不要用太多的默認了,因為默認用多了都不知道是怎么回事了,還有,當一些事情不太確定的時候,不防去試一下,反應(yīng)試一下也無所謂,自己親自去試了才能印象更深,希望大家在學(xué)EJB的時候,多多動手去寫寫。我也得努力了:)

          主站蜘蛛池模板: 土默特左旗| 南漳县| 讷河市| 德清县| 陈巴尔虎旗| 鄄城县| 新沂市| 株洲县| 襄汾县| 瑞金市| 益阳市| 黔江区| 怀仁县| 怀柔区| 临江市| 嘉定区| 新绛县| 长岭县| 贺兰县| 沽源县| 弥渡县| 来宾市| 从江县| 富阳市| 宣武区| 年辖:市辖区| 那曲县| 江阴市| 永胜县| 永安市| 白水县| 德惠市| 万源市| 白沙| 海安县| 广安市| 金平| 密云县| 扎兰屯市| 象州县| 阿合奇县|