Posted on 2007-10-12 11:06
semovy 阅读(293)
评论(0) 编辑 收藏 所属分类:
EJB
非实体的基类映射
最近我们都说了很多继承方面的映射策略,可是有时候我们却需要继承一个非实体的类,这个类存在于我们的工程项目中,但是我们又不希望它成为一个实体类,这个时候怎么办呢?这个时候我们可以用@javax.persistence.MappedSuperclass来注释它,我们现在就修改一下我们前几天的例子,把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已经不是一个实体类了,所以在数据库里面将没有它所对应的表,所有的子类都继承了定义在它里面的属性,当然,如果你想在子类里面重新定义在父类里面定义过的属性的时候,你可以用@javax.persistence.AttributeOverride来声明,当我们的代码运行以后,将会在数据库里面建立如下的结构:
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来指定重写的属性,所以在数据库里面lastName对应的列就变成了SURNAME.像这种映射方法在你不想强制你的超类持久化的时候特别有用。
@MappedSuperclass不仅可以注释在基类上面,你也可以注释在两个层次的实体类中间,当然,你也可以不加任何注释,不过,当你什么注释都不加的时候,持久化管理器就会完全忽略你的这个类了。
个人还是觉得要映射的时候,写清楚更好一些,不要用太多的默认了,因为默认用多了都不知道是怎么回事了,还有,当一些事情不太确定的时候,不防去试一下,反应试一下也无所谓,自己亲自去试了才能印象更深,希望大家在学EJB的时候,多多动手去写写。我也得努力了:)