Hibernate处理继承,如公司与员工存在一对多关系,对应的继承关系如图所思:
hibernate处理:
(1)继承关系树的每一个具体类对应一个表,所以有三个表,一个公司表,一个小时员工表,一个薪水员工表
公司表对应的配置文件:
<hibernate-mapping package="bean">
<class name="bean.Company" table="t_company">
<cache usage="read-only"/>
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="name" column="name"></property>
</class>
</hibernate-mapping>
小时员工对应的配置文件:
<hibernate-mapping package="bean">
<class name="bean.HouryEmplyee" table="t_houryEmplyee">
<cache usage="read-only"/>
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="name" column="name"></property>
<property name="rat" column="rat"></property>
<many-to-one name="companys" cascade="save-update" class="bean.Company"/>
</class>
</hibernate-mapping>
薪水员工对应的配置文件 同 小时员工对应的配置文件
(2)继承树的根元素对应一个表,就是一个公司表,一个员工表,里面包含了,小时,和,薪水字段,还有一个,比较用来区分两个的类别字段
公司的配置文件:
<hibernate-mapping package="bean">
<class name="bean.Company" table="t_company">
<cache usage="read-only"/>
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="name" column="name"></property>
<set name="emplyees" inverse="true">
<key column="emplyee_id"/>
<one-to-many class="bean.Emplyee"/>
</set>
</class>
</hibernate-mapping>
跟类员工表,配置文件,
<hibernate-mapping package="bean">
<class name="bean.Emplyee" table="t_Emplyee">
<cache usage="read-only"/>
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="name" column="name"></property>
<many-to-one name="companys" cascade="save-update" class="bean.Company"/>
<discriminator column="type"></discriminator>
<subclass discriminator-value="HE" name="bean.HouryEmply">
<property name="hour" column="hour"></property>
</subclass>
<subclass discriminator-value="SE" name="bean.SalaryEmply">
<property name="rat" column="rat"></property>
</subclass>
</class>
</hibernate-mapping>
注意:这里,用来discriminator 来设置,对于不同的类别,来区分的标志,<subclass>里,包含各自拥有的属性
对于他们的查找,可以,from Emplyee 也可以 from HouryEmply 或者 from SalaryEmpy
也就是,可以查找他们的子类,数据库中对应的字段type,存的值为discriminator-value 对应的值 HE 或者 SE
(3)继承关系树的每个类对应一个表 那么就有四个表,
公司的配置文件
<hibernate-mapping package="bean">
<class name="bean.Company" table="t_company">
<cache usage="read-only"/>
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="name" column="name"></property>
<set name="emplyees" inverse="true">
<key column="emplyee_id"/>
<one-to-many class="bean.Emplyee"/>
</set>
</class>
</hibernate-mapping>
员工对应的映射文件为:关键
<hibernate-mapping package="bean">
<class name="bean.Emplyee" table="t_Emplyee">
<cache usage="read-only"/>
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property name="name" column="name"></property>
<many-to-one name="companys" cascade="save-update" class="bean.Company"/>
<joined-subclass name="bean.HouryEmpy" table="t_houry_emplyee">
<key column="hour_emplyee_id"/>
<property name="hour" column="hour"></property>
</joined-subclass>
<joined-subclass name="bean.SalaryEmpy" table="t_salary_emplyee">
<key column="salary_emplyee_id"/>
<property name="rat" column="rat"></property>
</joined-subclass>
</class>
</hibernate-mapping>
注意,这里与上面对应的subclass的配置,subclass没有单独对应的表,他的取值,是通过discriminator-value 制定的,
可以看下面代码不同点:
<discriminator column="type"></discriminator>
<subclass discriminator-value="HE" name="bean.HouryEmply">
<property name="hour" column="hour"></property>
</subclass>
<subclass discriminator-value="SE" name="bean.SalaryEmply">
<property name="rat" column="rat"></property>
</subclass>
<joined-subclass name="bean.HouryEmpy" table="t_houry_emplyee">
<key column="hour_emplyee_id"/>
<property name="hour" column="hour"></property>
</joined-subclass>
<joined-subclass name="bean.SalaryEmpy" table="t_salary_emplyee">
<key column="salary_emplyee_id"/>
<property name="rat" column="rat"></property>
</joined-subclass>
注意:如果不在父类配置文件里配置,可以在单独个各自文件里配置属性
如:在小时员工表里配置: 一定要添加继承关系
<hibernate-mapping package="bean">
<joined-subclass name="bean.HouryEmpy" table="t_houry_emplyee" extends="bean.Emplyee">
<key column="hour_emplyee_id"/>
<property name="hour" column="hour"></property>
</joined-subclass>
</hibernate-mapping>
同样,该配置,可以查找Emplee,也可以查找他们的子类
注:文章,内容摘自《精通Hibernate:Java对象持久化技术详解》