关系模型以下:git
映射文件以下:github
<hibernate-mapping package="com.nnngu"> <class name="Animal" table="t_animal" lazy="false"> <id name="id"> <generator class="native"/> </id> <discriminator column="type" type="string"/> <property name="name"/> <property name="sex"/> <subclass name="Pig" discriminator-value="P"> <property name="weight"/> </subclass> <subclass name="Bird" discriminator-value="B"> <property name="height"/> </subclass> </class> </hibernate-mapping>
说明:数据库
由于类继承树确定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪一个类的。这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。app
用hibernate实现这种策略的时候,有以下步骤:post
一、父类用普通的<class>
标签订义hibernate
二、在父类中定义一个discriminator,即指定这个区分的字段的名称和类型
如:<discriminator column=”XXX” type=”string”/>
code
三、子类使用<subclass>
标签订义,在定义subclass的时候,须要注意以下几点:xml
关系模型以下:对象
映射文件以下:blog
<hibernate-mapping package="com.nnngu"> <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="pid"/> <property name="weight"/> </joined-subclass> <joined-subclass name="Bird" table="t_bird"> <key column="bid"/> <property name="height"/> </joined-subclass> </class> </hibernate-mapping>
说明:
这种策略是使用joined-subclass
标签来定义子类的。父类、子类,每一个类都对应一张数据库表。
在父类对应的数据库表中,实际上会存储全部的记录,包括父类和子类的记录;在子类对应的数据库表中,这个表只定义了子类中所特有的属性映射的字段。子类与父类,经过相同的主键值来关联。
实现这种策略的时候,有以下步骤:
一、父类用普通的<class>
标签订义便可
二、父类再也不须要定义discriminator
字段
三、子类用<joined-subclass>
标签订义,在定义joined-subclass
的时候,须要注意以下几点:
<key column=”PARENT_KEY_ID”/>
,这里的column,实际上就是父类的主键对应的映射字段名称。关系模型以下:
映射文件以下:
<hibernate-mapping package="com.nnngu"> <class name="Animal" table="t_animal" abstract="true"> <id name="id"> <generator class="assigned"/> </id> <property name="name"/> <property name="sex"/> <union-subclass name="Pig" table="t_pig"> <property name="weight"/> </union-subclass> <union-subclass name="Bird" table="t_bird"> <property name="height"/> </union-subclass> </class> </hibernate-mapping>
说明:
这种策略是使用union-subclass标签来定义子类的。每一个子类对应一张表,并且这个表的信息是完备的,即包含了全部从父类继承下来的属性映射的字段(这就是它跟joined-subclass的不一样之处,joined-subclass定义的子类的表,只包含子类特有属性映射的字段)。
实现这种策略的时候,有以下步骤:
一、父类用普通<class>
标签订义便可
二、子类用<union-subclass>
标签订义,在定义union-subclass的时候,须要注意以下几点:
注意:在保存对象的时候id不能重复(不能使用数据库的自增方式生成主键)