1.单表继承:即每棵类继承树使用一个表。
(1)类继承树对应多个类,多个类的信息存储于一张表中,那么如何区分某条记录属于哪个类?
采用的机制是在表中添加一个字段,用字段的值来进行区分。
(2)配置文件如下:
<hibernate-mapping package="包名">
<class name="父类名称" table="对应的表名">
<id name="id">
<generator class="native"></generator>
</id>
<discriminator column="新增加的字段名称" type="对应的类型"></discriminator>
<property name="父类属性"></property>
...........
<subclass name="子类名称" discriminator-value="该子类对应的鉴别值">
<property name="子类的属性"></property>
</subclass>
<subclass name="子类名称" discriminator-value="该子类对应的鉴别值">
<property name="子类的属性"></property>
</subclass>
</class>
<!-- 这种方法繁琐,所以采用上面的配置 <subclass name="子类名称" extends="父类名称"></subclass> -->
</hibernate-mapping>
说明如下:
A:父类采用<class>标签定义
B:在父类中定义一个discriminator,即指定用于区分字段的名称和类型
<discriminator column="区分字段名称" type="类型"></discriminator>
C:子类使用<subclass>标签,name属性指明子类的路径,discriminator-value属性指定用于区分该类字段的值。
子类的属性也是用<property>加以标识。
D:<subclass>与<class>可以平行,但需要指定继承的名称,较繁琐,所以使用<class>包含<subclass>的形式。
另外:
多态查询:即在hibernate加载数据的时候能够鉴别出真正的类型。
(1)get方式支持多态查询,因为get不支持lazy策略,所以不生成代理类。
(2)load默认情况下是支持lazy的,所以不支持多态查询,当lazy设置为false时,才支持多态查询。
(3)HQL支持多态查询。