千里冰封
JAVA 浓香四溢
posts - 151,comments - 2801,trackbacks - 0

非实体的基类映射

最近我们都说了很多继承方面的映射策略,可是有时候我们却需要继承一个非实体的类,这个类存在于我们的工程项目中,但是我们又不希望它成为一个实体类,这个时候怎么办呢?这个时候我们可以用@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 千里冰封 阅读(1154) 评论(0)  编辑  收藏 所属分类: JAVAEE

只有注册用户登录后才能发表评论。


网站导航: