版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_27108161/article/details/53840013
subclass:
<hibernate-mapping package="com.atguigu.hibernate.subclass">
<class name="Person" table="PERSONS" discriminator-value="PERSON">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<!-- 配置辨别者列 -->
<discriminator column="TYPE" type="string"></discriminator>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<!-- 映射子类 Student, 使用 subclass 进行映射 -->
<subclass name="Student" discriminator-value="STUDENT">
<property name="school" type="string" column="SCHOOL"></property>
</subclass>
</class>
</hibernate-mapping>
- 插入操作:
-
- 对于子类对象只需把记录插入到一张数据表中.
-
- 辨别者列有 Hibernate 自动维护.
-
- 查询:
-
- 查询父类记录, 只需要查询一张数据表
-
- 对于子类记录, 也只需要查询一张数据表
缺点:
- 1 使用了辨别者列.
- 2 子类独有的字段不能添加非空约束.
3 若继承层次较深, 则数据表的字段也会较多.
JOINED-SUBCLASS:
<hibernate-mapping package="com.atguigu.hibernate.joined.subclass">
<class name="Person" table="PERSONS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<joined-subclass name="Student" table="STUDENTS">
<key column="STUDENT_id"></key>
<property name="school" type="string" column="SCHOOL"></property>
</joined-subclass>
</class>
</hibernate-mapping>
- 插入操作:
-
- 对于子类对象至少需要插入到两张数据表中.
- 查询:
- 1 查询父类记录, 做一个左外连接查询
- 2 对于子类记录, 做一个内连接查询.
- 优点:
- 1 不需要使用了辨别者列.
- 2 子类独有的字段能添加非空约束.
- 3 没有冗余的字段.
UNION-SUBCLASS:
<hibernate-mapping package="com.atguigu.hibernate.union.subclass">
<class name="Person" table="PERSONS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="hilo" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<union-subclass name="Student" table="STUDENTS">
<property name="school" column="SCHOOL" type="string"></property>
</union-subclass>
</class>
</hibernate-mapping>
- 插入操作:
-
- 对于子类对象只需把记录插入到一张数据表中.
- 查询:
- 1 查询父类记录, 需把父表和子表记录汇总到一起再做查询. 性能稍差.
- 2 对于子类记录, 也只需要查询一张数据表
- 优点:
- 1 无需使用辨别者列.
- 2 子类独有的字段能添加非空约束.
- 缺点:
- 1 存在冗余的字段
- 2 若更新父表的字段, 则更新的效率较低