非实体的基类映射
最近我们都说了很多继承方面的映射策略,可是有时候我们却需要继承一个非实体的类,这个类存在于我们的工程项目中,但是我们又不希望它成为一个实体类,这个时候怎么办呢?这个时候我们可以用@javax.persistence.MappedSuperclass来注释它,我们现在就修改一下我们前几天的例子,把Person类定义成一个不持久化的类。代码如下:
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来声明,当我们的代码运行以后,将会在数据库里面建立如下的结构:
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的时候,多多动手去写写。我也得努力了:)
尽管千里冰封
依然拥有晴空
品尝JAVA的浓香,你我共享!! posted on 2007-10-11 00:23 千里冰封 阅
Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1821027