Hibernate 是一个对象关系映射和持久性框架,它提供了许多高级特性,从内省到多态和继承映射。这里讲介绍三个策略,在日常的编程之中您可以用它们把复杂的对象模型容易地映射到关系数据库模型。
继承映射
(1)单表继承即是每棵类继承树使用一个表。如下图:
Animal.hbm.xml中的文件代码:
<class name="com.lsh.hibernate.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="com.lsh.hibernate.Pig" discriminator-value="P">
<property name="weight"/>
</subclass>
<subclass name="com.lsh.hibernate.Bird" discriminator-value="B">
<property name="height"/>
</subclass>
</class>
优缺点:首先表中引入的区分子类的字段,也就是包括了描述其他字段的字段。其次,如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段not null(非空),维护起来方便,只需要修改一个表,灵活性差,表中冗余字段会随着子类的增多而越来越多,在任何情况下,都只需处理一个表,对于单个对象的持久话操作只需要处理一个表
(2)具体继承表,每个子类一个表。如下图:
Animal.hbm.xml中的文件代码:
<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>
优缺点:这种设计方式完全符合关系模型的设计原则,且不存在冗余,维护起来比较方便,对每个类的修改只需要修改其所对应的表,灵活性很好,完全是参照对象继承的方式进行配置,对于父类的查询需要使用左外链接,对于子类查询需要使用内链接,对于子类的持久话至少要处理两个表
(3)类表继承。每个具体类一个表(有一些限制)。如下图:
Animal.hbm.xml中的文件代码:
<class name="Animal" table="t_animal">
<id name="id">
<generator class="assigned"/>
</id>
<property name="name"/>
<property name="sex"/>
<union-subclass name="Pig" table="t_pig">
<property name="weight"></property>
</union-subclass>
<union-subclass name="Bird" table="t_bird">
<property name="height"></property>
</union-subclass>
</class>
优缺点:这种设计方式符合关系模型的设计原则,但有表中存在重复字段的问题。如果需要对基类进行修改,则需要对基类以及该类的子类所对应的所有表都进行修改,映射的灵活性很大,子类可以包括基类属性在内的每一个属性进行单独配置,对于子类的查询只需要访问单独的表,对父类查询怎需要检索所有的表,对于单个对象持久话操作只需要处理一个表。