- union-subclass映射与joined-subclass映射非常相似,子类增加的属性也可以有非空约束——即父类实例的数据保存在父表中,而子类实例的数据则保存在子表中。与joined-subclass不同的是,子类实例的数据仅保存在子类表中,没有在父类表中有任何记录。在这种映射策略下,子类表的字段会比父类表的字段要多,因为子类表的字段等于父类属性加子类增加属性的总和。
2、使用 union-subclass映射策略是不可使用identity主键生成策略的,因为同一类继承层次中所有实体类必须使用同一个主键种子(即多个持久化实体对应的记录的主键是连续的**)。受此影响,也不应该使用native主键生成策略,因为native会根据数据库来选择使用identity或sequence策略。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="BasicCar" abstract = “true” catalog="test">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="factory" type="java.lang.String">
<column name="factory" length="20" not-null="true" />
</property>
<property name="date" type="java.util.Date">
<column name="date" length="10" not-null="true" />
</property>
<union-subclass name=“Lorry” table=“lorry”>
<property name = “loadweight” column = “loadweight” type = java.lang.Double”></property>
</union-subclass>
<union-subclass name=“SaloonCar” table=“salooncar”>
<property name = “loadpersons” column = “loadpersons” type =java.lang.Integer”></property>
</union-subclass>
</class>
</hibernate-mapping>
<union-subclass>
元素配置,并在该元素中通过<property>
配置子类的新增属性。<union-subclass>
元素不包含<key>
标签
这种映射策略下各个表之间没有关联关系,每张表对应一个具体的实体类。父类实例的数据保存在父类表中;子类实例的数据仅仅保存在自己的子类表中,而在父类表中没有任何记录。
对于插入操作,父类(如果不是抽象类)记录插入父类表,子类记录插入子类表,各个表都互不影响。