ITEEDU

Hibernate Gossip: 继承 - Table per  subclass

接续 上一个主题 ,在使用Table per class hierarchy映射继承关系时,会有大量的字段有NULL的情况,好处是使用一个表格,查询时只需一次SQL。

Table per subclass的继承映像方式,给予父类与子类分别的表格,而父类与子类对应的表格透过外键来产生关联,具体的说,User类别、DefaultUser类别与PowerUser类别所映像的表格如下:
Table per subclass

其中user表格的id与defaultuser及poweruser的id 一致,具体的说,在储存DefaultUser实例时,id与name属性记录在user表格中,而someProperty记录在 defaultuser中,假设user表格的id值为1,则defaultuser表格对应的该笔记录其id值也会为一。

可以使用以下的SQL建立资料表:
 CREATE TABLE user (

    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default ''
);

CREATE TABLE defaultuser (
    id INT(11) NOT NULL PRIMARY KEY,
    someProperty VARCHAR(100)
);

CREATE TABLE poweruser (
    id INT(11) NOT NULL PRIMARY KEY,
    otherProperty VARCHAR(100)
);
在映射文件上,如下定义:
User.hbm.xml
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="onlyfun.caterpillar.User" table="user">

<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>

<property name="name" column="name" type="java.lang.String"/>

<joined-subclass name="onlyfun.caterpillar.DefaultUser"
table="defaultuser">
<key column="id"/>
<property name="someProperty"
column="someProperty"
type="java.lang.String"/>
</joined-subclass>

<joined-subclass name="onlyfun.caterpillar.PowerUser"
table="poweruser">
<key column="id"/>
<property name="otherProperty"
column="otherProperty"
type="java.lang.String"/>
</joined-subclass>
</class>

</hibernate-mapping>
<joined-subclass>指明了子类别与所对应的表格,<key column>指明子类别的对应表格中,哪一个字段要与父类别的主键一致。

使用 继承 - Table per concrete class 中的储存程序片段,则查询表格时可以发现以下的结果:
mysql> select * from user;
+-----+-------------+
| id     | name         |
+-----+-------------+
|  1     | caterpillar |
|  2     | Bush         |
+-----+-------------+
2 rows in set (0.00 sec)

mysql> select * from defaultuser;
+----+-------------------+
| id    | someProperty |
+----+-------------------+
|  2    | hu....hu...         |
+----+------------------+
1 row in set (0.00 sec)

mysql> select * from poweruser;
+----+-------------------+
| id    | otherProperty |
+----+-------------------+
|  1    | Bla...Bla...         |
+----+-------------------+
1 row in set (0.00 sec)


仔细观察一下,看看defaultuser与poweruser表格中的id各自是对应于user表格中的哪笔数据。