继承这个词多半用在OOP编程里,比如类的继承,但是在Hibernate里表也有继承关系,这也难怪,因为Hibernate的目的就是要把数据库对象化。
先来看一个简单的例子,一个人员表Person,这张表里主要纪录一些公司人员的基本信息;还有一张用户表User,这张表纪录的是公司里的人员登陆公司网站的用户名信息表;很显然用户来源于人员,一个人员可以有多个用户,而一个用户只对应一个人员,这样User这张表就可以继承Person这张表了,因为它完全符合继承关系的条件,即User是在Person的基础上扩展而来的。
下面我们看看上例Hibernate里的HBM XML文件和POJO类是怎么写的,先看HBM XML文件的写法:
<class name="org.user.dao.hibernate.Person" table="person">
<id name="id" column="id"><generator class="increment" /></id>
<property name="firstName" column="firstname" length="30"/>
<property name="lastName" column="lastname" length="30"/>
<joined-subclass name="org.user.dao.hibernate.User" table="user">
<key column="person_id"/>
<property name="id" column="id"/>
<property name="userName" column="user_name"/>
</joined-subclass>
</class>
这个XML文件体现了Person和User的继承关系,如果你还是不太清楚地话,看下面的POJO类,那可是百分之百的继承关系了:
package org.user.dao.hibernate;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 6254796603241870646L;
private long id;
private String firstName;
private String lastName;
public Person() {
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
User类的写法:
package org.user.dao.hibernate;
public class User extends Person {
private static final long serialVersionUID = 2848034506633654174L;
private String userName;
public User() {
}
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
至此Hibernate里数据库表的继承关系就完全展示出来了。Hibernate里使用映射文件(HBM XML文件)和POJO类来完全封装数据库,使数据库完全对象化,而我们在写程序操作数据库时也完全像操作一个对象一样,这样数据库表的继承关系也表现的非常自然了。