Posted on 2007-10-12 10:48
semovy 阅读(260)
评论(0) 编辑 收藏 所属分类:
EJB
继承映射策略之----每个具体类一张表
昨天我们看了继承关系中的实现,昨天是用一张表保存所有级别的类,今天我们来了解一下第二种实现方法,每一个类一个单独的表的实现,在数据库我们的例子表现如下:
create table Person (
id integer primary key not null,
firstName varchar(255),
lastName varchar(255),
);
create table Customer (
id integer primary key not null,
firstName varchar(255),
lastName varchar(255),
street varchar(255),
city varchar(255),
state varchar(255),
zip varchar(255),
);
create table Employee (
id integer primary key not null,
firstName varchar(255),
lastName varchar(255),
street varchar(255),
city varchar(255),
state varchar(255),
zip varchar(255),
employeeId integer,
);
此种方式和SINGLE_TABLE的最大的不同就是这些表里面没有了辨别器这一列了,我们不再需要为每一个特定的类设定一个标志以识别它是哪个具体的类了。在这种方式的实现里,每一张表都保存了该类的所有的属性,当然也包括它从父类中继承过来的属性。我们看看代码吧:
@Entity
@Inheritance(strategy=InheritanceType
.TABLE_PER_CLASS)
public class Person {
}
@Entity
public class Customer extends Person {
}
@Entity
public class Employee extends Customer {
}
从以上代码可以看出,唯一需要的元数据注释只有InheritanceType,并且这个注释仅仅是用在基类Person上面而已,在他的子类中,根本看不出来有什么不一样,它们就像一个很普通的实体BEAN一样。
优点:
相比于SINGLE_TABLE的映射策略来说,此策略的优点是你可以在每一个子类上定义一些属性的约束,比方说某些属性不能为null等等,这些都是可以定义的,但是你在SINGLE_TABLE里面却是不能定义的,它还有一个优点就是,它对于处理那些遗留的数据库来说更加的容易一些,因为它更灵活一些。
缺点:
此策略依然是不规范的,没有做到物尽其用,因为它为每一个子类都重复定义了很多列,这势必给数据库的资源造成了浪费,当需要进行多态加载的时候,就会进行多次查询,这样也会降低数据库的查询效率,这样比较起来就没有SINGLE_TABLE 策略速度快,但是它在别的方面性能会好一些,在开发你的实体BEAN的时候,最好不要用这种策略,除非你不得不这样做,否则还是用第三种策略来得更好一些,那第三种策略是怎样实现的呢,我们下次再讲。