`

Hibernate继承映射二:每个子类一张表

阅读更多

修改Hibernate继承映射一:http://quicker.iteye.com/blog/658411 中的配置文件,就能得到继承映射的第二种策略

首先看看继承映射第二种策略怎么做

Hibernate继承映射的第二种策略:每个类对应一张表

1、如何映射
这种策略是使用joined-subclass标签来定义子类的。父类、子类,每个类都对应一张数据库表。
在父类对应的数据库表中,实际上会存储所有的记录,包括父类和子类的记录;在子类对应的数据库表中,
这个表只定义了子类中所特有的属性映射的字段。子类与父类,通过相同的主键值来关联。实现这种策略的时候,有如下步骤:
父类用普通的<class>标签定义即可
父类不再需要定义discriminator字段
子类用<joined-subclass>标签定义,在定义joined-subclass的时候,需要注意如下几点:
Joined-subclass标签的name属性是子类的全路径名
Joined-subclass标签需要包含一个key标签,这个标签指定了子类和父类之间是通过哪个字段来关联的。
如:<key column=”PARENT_KEY_ID”/>,这里的column,实际上就是父类的主键对应的映射字段名称。
Joined-subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继承关系),
也可以与class标签平行。 当Joined-subclass标签的定义与class标签平行的时候,需要在Joined-subclass标签中,添加extends属性,里面的值是父类的全路径名称。
子类的其它属性,像普通类一样,定义在joined-subclass标签的内部。

2、存储和多态查询参见策略一:每棵类继承树对应一张表

 

 

修改配置文件如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lwf.hibernate.extend1">
	<class name="Animal" table="t_animal">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<property name="sex"/>
		<joined-subclass name="Pig" table="t_pig">
			<key column="id"/>
			<property name="weight"/>
		</joined-subclass>
		<joined-subclass name="Bird" table="t_bird">
			<key column="id"/>
			<property name="height"/>
		</joined-subclass>
	</class>
</hibernate-mapping>	

 

 

对应的表结构如下:

mysql> desc t_animal;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| sex   | bit(1)       | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.14 sec)

mysql> desc t_bird;
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | NO   | PRI |         |       |
| height | int(11) | YES  |     | NULL    |       |
+--------+---------+------+-----+---------+-------+

mysql> desc t_pig;
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | NO   | PRI |         |       |
| weight | int(11) | YES  |     | NULL    |       |
+--------+---------+------+-----+---------+-------+

 

 

其它文件不变,使用测试类测试.插入数据后如下:

mysql> select * from t_animal;
+----+------+------+
| id | name | sex  |
+----+------+------+
|  1 | 猪1  |     |
|  2 | 孔雀 |     |
+----+------+------+
2 rows in set (0.00 sec)

mysql> select * from t_pig;
+----+--------+
| id | weight |
+----+--------+
|  1 |    400 |
+----+--------+
1 row in set (0.00 sec)

mysql> select * from t_bird;
+----+--------+
| id | height |
+----+--------+
|  2 |    100 |

 

分享到:
评论

相关推荐

    Hibernate继承映射一:每个类分层结构一张表

    2. 每个子类都有一张表,可能导致更多的数据库表,这可能会影响数据库的性能和管理复杂性。 3. 由于每张表都有自己的主键,所以不能共享同一个主键序列,可能需要为每个子类单独设置主键生成策略。 总之,“每个类...

    Hibernate继承映射的第一种策略:每个具体类一张表

    本篇文章将详细探讨Hibernate继承映射的策略,特别是“每个具体类一张表”(Table Per Concrete Class)的映射方式。 在面向对象编程中,继承是常见的代码复用手段,但在关系型数据库中,这种概念并不直接对应。...

    Hibernate继承映射代码

    2. 联合继承:每个子类都有自己的表,基类中的公共属性会被共享到一个单独的表中。这种策略可以保持表结构清晰,但可能导致大量的JOIN操作。 3. 表 per 类继承:每个类都对应一个单独的表,包括基类。这种策略易于...

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承策略。 ### 单一表继承策略 在单一表继承策略中,所有类层次结构中的实例都存储在同一张数据库表中。这种策略通过在表中...

    Hibernate继承映射的第一种策略:每个类对应一张表

    本文将详细探讨“Hibernate继承映射的第一种策略:每个类对应一张表”的概念、实现方式以及其优缺点。 首先,我们需要理解Hibernate继承映射的基本策略。在面向对象编程中,类继承是常见的代码复用手段,但在数据库...

    hibernate映射继承关系(每个类都对应一张表)

    总结起来,"每个类都对应一张表"的继承映射策略在Hibernate中是一种直接且易于理解的方法,适合那些每个类都有独特属性的情况。然而,它可能不适合所有场景,特别是当子类众多或者需要减少数据冗余时。在实际应用中...

    Hibernate继承映射-概述

    2. **表-per-class(Table per Class Inheritance)**:每个子类对应一个独立的数据库表,父类通常不会有自己的表,而是通过子类间接表示。 3. **联合继承(Concrete Table Inheritance)**:每个子类都有自己的...

    hibernate继承映射.rar

    联合继承策略中,基类和每个子类都有自己的表,子类表中包含基类表的主键作为外键。这种方式适合当基类有属性,而子类没有额外属性时使用。在Hibernate-lab2实验中,如果`Person`类有通用属性如`name`和`age`,而`...

    Hibernate继承映射(annotation)

    **标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在使用注解的方式进行配置时,这个过程变得更加...

    用Hibernate映射继承关系

    在Hibernate中映射继承关系时,一种常见的策略是将继承关系树的每个具体类映射到单独的数据库表中。这种方法称为**表/类映射**(Table/Class Mapping),是最直观且简单的映射方式。它不考虑抽象类或继承关系,而是...

    Hibernate继承关系映射.pdf

    隐式继承映射也称为“表/子类”映射策略,它为继承层次中的每个子类创建一个独立的表,并在每个子类表中重复父类的属性。这种方式下,父类并没有对应的表,而是由子类表来间接表示。 #### 示例代码 ```xml ...

    14 继承(一)(整个继承树映射到一张表)

    每个子类在数据库表中增加一个表示类类型的字段,例如`discriminator_column`。当查询时,Hibernate根据这个字段值决定返回哪个类的对象。 2. **表-per-hierarchy(Table per Hierarchy,TPH)**: TPH是STI的另一种...

    15 继承(二)(每个子类扩展的属性单独保存在一张表中)

    标题中的“15 继承(二)(每个子类扩展的属性单独保存在一张表中)”指的是在数据库设计中,特别是在使用对象关系映射(ORM)框架如Hibernate时,处理继承关系的一种策略——单表继承(Single Table Inheritance,STI)...

    hibernate关联映射实例

    CTI则是每个子类对应一张表;TPH将所有类的属性都放入一张表,使用`@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`、`@Inheritance(strategy=InheritanceType.JOINED)`或`@Inheritance(strategy=...

    hibernate的继承映射(InheritanceMapping)[文].pdf

    10.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 在某些情况下,开发者可以选择在继承层次的不同部分使用不同的映射策略,然后通过隐式多态来实现整个层次的多态性。但Hibernate不支持在同一阶级元素...

Global site tag (gtag.js) - Google Analytics