现在的位置: 首页 > 综合 > 正文

hibernate继承关系映射

2018年08月19日 ⁄ 综合 ⁄ 共 8620字 ⁄ 字号 评论关闭

在问题域中实体之间的继承关系在数据库中有多种体现方式。在hibernate中,要实现面向对象的对实体进行持久化操作,那么就需要对实体类进行继承关系映射。

根据数据表的不同形态,映射方案有三种

实体继承关系模型:

1.Tpc每个具体类一张表


mysql> show tables;

+-------------------+

| Tables_in_db_test |

+-------------------+

| tb_student          |

| tb_worker           |

+-------------------+

2 rows in set (0.00 sec)

表结构:

mysql> desc tb_student;

+--------+--------------+------+-----+---------+-------+

| Field  | Type           | Null | Key | Default | Extra |

+--------+--------------+------+-----+---------+-------+

| id     | int(11)        | NO    | PRI | NULL     |       |

| name   | varchar(255)  | YES  |      | NULL      |       |

| sex    | varchar(255)  | YES  |      | NULL      |       |

| age    | int(11)        | YES  |      | NULL      |       |

| sno    | varchar(255)  | YES  |      | NULL    |       |

| school | varchar(255) | YES  |      | NULL    |       |

+--------+--------------+------+-----+---------+-------+

mysql> desc tb_worker;

+--------+--------------+------+-----+---------+-------+

| Field  | Type         | Null | Key | Default | Extra |

+--------+--------------+------+-----+---------+-------+

| id     | int(11)      | NO   | PRI | NULL    |       |

| name   | varchar(255) | YES  |     | NULL    |       |

| sex    | varchar(255) | YES  |     | NULL    |       |

| age    | int(11)      | YES  |     | NULL    |       |

| no     | varchar(255) | YES  |     | NULL    |       |

| salary | double       | YES  |     | NULL    |       |

+--------+--------------+------+-----+---------+-------+


Person.hbm.xml


[html] view
plain
copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="entities">  
  6.     <!-- table per concrete (a. 具体的,实际的) -->  
  7.     <!-- 每一个具体类一张表 -->  
  8.     <!-- 虚拟选项为'true' -->  
  9.     <class name="Person" table="tb_person" abstract="true">  
  10.     <id column="id" name="id" type="java.lang.Integer">  
  11.         <!-- 主键的生成策略为'分配' -->  
  12.         <generator class="assigned"></generator>  
  13.     </id>  
  14.     <property column="name" name="name" type="string"></property>  
  15.     <property column="sex" name="sex" type="string"></property>  
  16.     <property column="age" name="age" type="java.lang.Integer"></property>  
  17.       
  18.     <!--student具体类-->  
  19.     <union-subclass name="Student" table="tb_student">  
  20.         <property column="sno" name="sno" type="string"></property>       
  21.         <property column="school" name="school" type="string"></property>  
  22.     </union-subclass>  
  23.       
  24.     <!--worker具体类-->  
  25.     <union-subclass name="Worker" table="tb_worker">  
  26.         <property column="no" name="no" type="string"></property>  
  27.         <property column="salary" name="salary" type="java.lang.Double"></property>  
  28.     </union-subclass>  
  29.       
  30.     </class>  
  31. </hibernate-mapping>  


1.tph每个继承树一张表


mysql> show tables;

+-------------------+

| Tables_in_db_test |

+-------------------+

| tb_person         |

+-------------------+

mysql> desc tb_person;

+---------+--------------+------+-----+---------+-------+

| Field   | Type         | Null | Key | Default | Extra |

+---------+--------------+------+-----+---------+-------+

| id      | int(11)      | NO   | PRI | NULL    |       |

| discram | varchar(255) | NO   |     | NULL    |       |

| name    | varchar(255) | YES  |     | NULL    |       |

| age     | int(11)      | YES  |     | NULL    |       |

| sex     | varchar(255) | YES  |     | NULL    |       |

| school  | varchar(255) | YES  |     | NULL    |       |

| sno     | varchar(255) | YES  |     | NULL    |       |

| no      | varchar(255) | YES  |     | NULL    |       |

| salary  | double       | YES  |     | NULL    |       |

+---------+--------------+------+-----+---------+-------+

Person.hbm.xml


[html] view
plain
copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="entities">  
  6.     <!-- tph table per hierarchy 一个继承树一张表 -->  
  7.     <!-- 父类 -->  
  8.     <class name="Person" table="tb_person">  
  9.         <id column="id" name="id" type="java.lang.Integer">  
  10.             <!-- 主键生成策略为 '分配'  -->  
  11.             <generator class="assigned"></generator>  
  12.         </id>  
  13.         <!-- 鉴定列,区分列 discriminator 鉴-->  
  14.         <discriminator column="discram" type="string"></discriminator>  
  15.         <property column="name" name="name" type="string"></property>  
  16.         <property column="age" name="age" type="java.lang.Integer"></property>  
  17.         <property column="sex" name="sex" type="string"></property>  
  18.       
  19.     <!-- 子类,其鉴定列值为'stu'-->  
  20.     <subclass name="Student" discriminator-value="stu">  
  21.         <property column="school" name="school" type="string"></property>  
  22.         <property column="sno" name="sno" type="string"></property>  
  23.     </subclass>  
  24.           
  25.     <!-- 子类,其鉴定列值为'worker'-->  
  26.     <subclass name="Worker" discriminator-value="worker">  
  27.         <property column="no" name="no" type="string"></property>  
  28.         <property column="salary" name="salary" type="java.lang.Double"></property>  
  29.     </subclass>  
  30.       
  31.     </class>  
  32. </hibernate-mapping>  



1.tps每个子类一张表

mysql> show tables;

+-------------------+

| Tables_in_db_test |

+-------------------+

| tb_person         |

| tb_student        |

| tb_worker         |

+-------------------+

mysql> desc tb_person;

+-------+--------------+------+-----+---------+-------+

| Field | Type         | Null | Key | Default | Extra |

+-------+--------------+------+-----+---------+-------+

| id    | int(11)      | NO   | PRI | NULL    |       |

| name  | varchar(255) | YES  |     | NULL    |       |

| sex   | varchar(255) | YES  |     | NULL    |       |

| age   | int(11)      | YES  |     | NULL    |       |

+-------+--------------+------+-----+---------+-------+

mysql> desc tb_student;

+-----------+--------------+------+-----+---------+-------+

| Field     | Type         | Null | Key | Default | Extra |

+-----------+--------------+------+-----+---------+-------+

| studentid | int(11)      | NO   | PRI | NULL    |       |

| sno       | varchar(255) | YES  |     | NULL    |       |

| school    | varchar(255) | YES  |     | NULL    |       |

+-----------+--------------+------+-----+---------+-------+

mysql> desc tb_worker;

+----------+--------------+------+-----+---------+-------+

| Field    | Type         | Null | Key | Default | Extra |

+----------+--------------+------+-----+---------+-------+

| workerid | int(11)      | NO   | PRI | NULL    |       |

| no       | varchar(255) | YES  |     | NULL    |       |

| salary   | varchar(255) | YES  |     | NULL    |       |

+----------+--------------+------+-----+---------+-------+


Person.hbm.xml


[html] view
plain
copy

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="entities">  
  6.     <!-- Person表 -->  
  7.     <class name="Person" table="tb_person">  
  8.         <id name="id">  
  9.             <!-- 父类的主键生成策略为‘分配’ -->  
  10.             <generator class="assigned"></generator>  
  11.         </id>  
  12.         <property name="name" type="string"></property>  
  13.         <property name="sex" type="string"></property>  
  14.         <property name="age" type="java.lang.Integer"></property>  
  15.           
  16.         <!-- student表 -->  
  17.         <joined-subclass name="Student" table="tb_student">  
  18.             <key column="studentid"></key>  
  19.             <property column="sno" name="sno" type="string" ></property>  
  20.             <property column="school" name="school" type="string" ></property>    
  21.         </joined-subclass>  
  22.           
  23.         <!-- worker表 -->  
  24.         <joined-subclass name="Worker" table="tb_worker">  
  25.             <key column="workerid"></key>  
  26.             <property column="no" name="no" type="string" ></property>  
  27.             <property column="salary" name="salary" type="string" ></property>  
  28.         </joined-subclass>  
  29.     </class>  
  30. </hibernate-mapping>  

方式一:每个具体类一张表(union-subclass) ,保存是子类完整信息(table per 

concrete )


建立关系模型原则每个具体类对应一张表,有多少具体类就需要建立多少个独立的表

优缺点:这种设计方式符合关系模型的设计原则,但有表中存在重复字段的问题。如果需要对基类进行修改,则需要对基类以及该类的子类所对应的所有表都进行修改,映射的灵活性很大,子类可以包括基类属性在内的每一个属性进行单独配置,对于子类的查询只需要访问单独的表,对父类查询怎需要检索所有的表,对于单个对象持久话操作只需要处理一个表

方式二:整个的继承体系就用一张表(table per 

hierarchy)


建立关系模型原则:描述一个继承关系只用一张表

优缺点:首先表中引入的区分子类的字段,也就是包括了描述其他字段的字段。其次,如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段not null(非空),维护起来方便,只需要修改一个表,灵活性差,表中冗余字段会随着子类的增多而越来越多,在任何情况下,都只需处理一个表,对于单个对象的持久话操作只需要处理一个表

方式三:每个子类一张表,存放子类所特有的属性(table per subclass)


建立关系模型原则每个子类使用一张表,但这些子类所对应的表都关联到基类所对应的表中

优缺点:这种设计方式完全符合关系模型的设计原则,且不存在冗余,维护起来比较方便,对每个类的修改只需要修改其所对应的表,灵活性很好,完全是参照对象继承的方式进行配置,对于父类的查询需要使用左外链接,对于子类查询需要使用内链接,对于子类的持久话至少要处理两个表

【上篇】
【下篇】

抱歉!评论已关闭.