我们可以将继承层次结构类与数据库的表映射。 在hibernate中定义了三个继承映射策略:
什么情况用?
子类教多,且子类较为简单,即只有个别属性!
方式一:整个的继承
体系就用一张表、数据库:t_animal (要存储所有的子类信息)
Id name sexweight heighttype_(“鉴别器”区别是哪个子类)
<hibernate-mapping package="com.hyxd.entity">
<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>
好处:因为使用一个映射文件, 减少了映射文件的个数。
缺点:(不符合数据库设计原则)一个映射文件: Animal.hbm.xml(如何区分是哪个子类的信息?)
总结:
写法较为简单:所有子类用一个映射文件,且映射到一张表!但数据库设计不合理!(不推荐用。)
<hibernate-mapping package="com.hyxd.entity">
<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>
总结:
一个映射文件,存储所有的子类; 子类父类都对应表;
缺点:表结构比较负责,插入一条子类信息,需要用2条sql: 往父类插入、往子类插入!
方式三:每个具体类一张表(union-subclass) ,保存是子类完整信息
<hibernate-mapping package="com.hyxd.entity">
<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>
总结:
所有的子类都写到一个映射文件;
父类不对应表; 每个子类对应一张表
注意:在保存对象的时候id不能重复(不能使用数据库的自增方式生成主键)