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

}
因?yàn)镻erson已經(jīng)不是一個(gè)實(shí)體類了,所以在數(shù)據(jù)庫里面將沒有它所對(duì)應(yīng)的表,所有的子類都繼承了定義在它里面的屬性,當(dāng)然,如果你想在子類里面重新定義在父類里面定義過的屬性的時(shí)候,你可以用@javax.persistence.AttributeOverride來聲明,當(dāng)我們的代碼運(yùn)行以后,將會(huì)在數(shù)據(jù)庫里面建立如下的結(jié)構(gòu):
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這些屬性,因?yàn)橛昧?span style="color: #0000ff">@AttributeOverride來指定重寫的屬性,所以在數(shù)據(jù)庫里面lastName對(duì)應(yīng)的列就變成了SURNAME.像這種映射方法在你不想強(qiáng)制你的超類持久化的時(shí)候特別有用。
@MappedSuperclass不僅可以注釋在基類上面,你也可以注釋在兩個(gè)層次的實(shí)體類中間,當(dāng)然,你也可以不加任何注釋,不過,當(dāng)你什么注釋都不加的時(shí)候,持久化管理器就會(huì)完全忽略你的這個(gè)類了。
個(gè)人還是覺得要映射的時(shí)候,寫清楚更好一些,不要用太多的默認(rèn)了,因?yàn)槟J(rèn)用多了都不知道是怎么回事了,還有,當(dāng)一些事情不太確定的時(shí)候,不防去試一下,反應(yīng)試一下也無所謂,自己親自去試了才能印象更深,希望大家在學(xué)EJB的時(shí)候,多多動(dòng)手去寫寫。我也得努力了:)