EJB学习日记(20)

2007年10月12日 01:06:00

非实体的基类映射

最近我们都说了很多继承方面的映射策略,可是有时候我们却需要继承一个非实体的类,这个类存在于我们的工程项目中,但是我们又不希望它成为一个实体类,这个时候怎么办呢?这个时候我们可以用@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的时候,多多动手去写写。我也得努力了:)




尽管千里冰封
依然拥有晴空


品尝JAVA的浓香,你我共享!!
posted on 2007-10-11 00:23 千里冰封

Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1821027


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值