虽然student与teacher有些许属性重复,但似乎传统方式在完成student与teacher没有什么问题,创建并不复杂…但如果,我们增加新的对象,医生,矿工,消防员,警察,程序员…这样看来传统方式并不适用…这就需要继承映射,Hbernate,TopLink等O-R映射框架都支持继承映射,在此,我会为大家讲解EJB3.0 JPA规范的继承映射!
学生,与老师共有的属性,属于所有人类都拥有的属性,故我们可以创建及Person类,来保存共有属性,而学生与老师继承自Person类,增加了自己的属性.
关键字 :Inheritance
对象使用引用以便关联到其它对象;关系型数据库表之间采用外键来描述表的关系。在关系型数据库中通常没有自然且有效的方法来描述类的继承关系。JPA通过Inheritance annotation提供了几种继承策略,它有以下属性:
InheritanceType strategy:用来声明继承策略。可选值是InheritanceType.SINGLE_TABLE、InheritanceType.JOINED和InheritanceType .TABLE_PER_CLASS。
缺省值是InheritanceType.SINGLE_TABLE。
关于Inheritance的更多内容,可以参考<< Hibernate实战>> by Christian Bauer, Gavin King。
一:
InheritanceType.SINGLE_TABLE 策略为类的继承体系采用同一个表。表名是基类的名称。例如:
首先创建父类:Person.java
Student.java
Teacher.java
执行单元测试,生成数据库表:
mysql> desc teacher;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | UNI | NULL | |
| sex | varchar(5) | NO | | NULL | |
| teach | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
sql语句是:
CREATE TABLE `person` (
`DTYPE` varchar(31) NOT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
`sex` varchar(5) NOT NULL,
`study` varchar(20) DEFAULT NULL,
`teach` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
UNIQUE KEY `study` (`study`),
UNIQUE KEY `teach` (`teach`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其中的DTYPE,是记录Person的具体子类型的!我们向数据库表输入数据!
查看数据库表:
但是,这样将所有对象保存在一个表中,增加了表的容量,这就需要使用InheritanceType.JOINED