EJB学习日记(18)

探讨了一种ORM中每类一表的继承映射策略,通过为每个子类创建独立的数据表,允许对子类属性施加更多约束,但可能会导致数据库资源的浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2007年10月10日 06:55:00
继承映射策略之----每个具体类一张表

昨天我们看了继承关系中的实现,昨天是用一张表保存所有级别的类,今天我们来了解一下第二种实现方法,每一个类一个单独的表的实现,在数据库我们的例子表现如下:

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的时候,最好不要用这种策略,除非你不得不这样做,否则还是用第三种策略来得更好一 些,那第三种策略是怎样实现的呢,我们下次再讲。

来自: 千里冰封

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值