精通Hibernate之映射继承关系四

这种映射方式只需为继承关系树的Employee根类创建一张表EMPLOYEES。如图14-4所示,在EMPLOYEES表中不仅提供和Employee类的属性对应的字段,还要提供和它的两个子类的所有属型对应的字段,此外,EMPLOYEES表中需要额外加入一个字符串类型的EMPLOYEE_TYPE字段,用于区分Employee的具体类型。

<id name="id" type="long" column="ID">
<generator class="increment"/>
</id>
<property name="name" type="string" column="NAME" />
<set
name="employees"
inverse="true"
lazy="true" >
<key column="COMPANY_ID" />
<one-to-many class="mypack.Employee" />
</set>
</class>
</hibernate-mapping>

Employee.hbm.xml文件用于把Employee类映射到EMPLOYEES表,在这个映射文件中,除了需要映射Employee类本身的属性,还需要在元素中映射两个子类的属性。例程14-6是Employee.hbm.xml文件的代码。

例程14-6 Employee.hbm.xml

<hibernate-mapping >
<class name="mypack.Employee" table="EMPLOYEES">
<id name="id" type="long" column="ID">
<generator class="increment"/>
</id>
<discriminator column="EMPLOYEE_TYPE" type="string" />
<property name="name" type="string" column="NAME" />
<many-to-one
name="company"
column="COMPANY_ID"
class="mypack.Company"
/>
<subclass name="mypack.HourlyEmployee" discriminator-value="HE" >
<property name="rate" column="RATE" type="double" />
</subclass>
<subclass name="mypack.SalariedEmployee" discriminator-value="SE" >
<property name="salary" column="SALARY" type="double" />
</subclass>
</class>
</hibernate-mapping>

在Employee.hbm.xml文件中,元素指定EMPLOYEES表中用于区分Employee类型的字段为EMPLOYEE_TYPE,两个元素用于映射HourlyEmployee类和SalariedEmployee类,元素的discriminator-value属性指定EMPLOYEE_TYPE字段的取值。EMPLOYEES表中有以下记录:

时间: 2024-12-23 20:14:40

精通Hibernate之映射继承关系四的相关文章

精通Hibernate之映射继承关系八

由于关系数据模型不允许一个表的外键同时参照两个表的主键,因此无法对TABLE_D表的A_ID字段定义外键参照约束,而应该通过其他方式,如触发器,来保证A_ID字段的参照完整性.由于TABLE_D表的A_ID字段既可能参照TABLE_B表的ID主键,也可能参照TABLE_C表的ID主键,要求TABLE_B表和TALBE_C表的ID主键具有相同的SQL类型. 在ClassD.hbm.xml文件中,用元素来映射ClassD的a属性: <any name="a" meta-type=&q

精通Hibernate之映射继承关系七

Company与Employee类之间为一对多多态关联关系,如果继承关系树的根类对应一个表,或者每个类对应一个表,那么就能映射Company类的employees集合.本节介绍如何映射多对一多态关联.如图14-11所示,ClassD与ClassA为多对一多态关联关系. 假定与ClassD对应的表为TABLE_D,与ClassA对应的表为TABLE_A,在TABLE_D中定义了外键A_ID,它参照TABLE_A表的主键. ClassD对象的a属性既可以引用ClassB对象,也可以引用ClassC对

精通Hibernate之映射继承关系一

在域模型中,类与类之间除了关联关系和聚集关系,还可以存在继承关系,在图14-1所示的域模型中,Company类和Employee类之间为一对多的双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化,它有两个具体的子类:HourlyEmployee类和SalariedEmployee类.由于Java只允许一个类最多有一个直接的父类,因此Employee类.HourlyEmployee类和SalariedEmployee类构成了一棵继承关系树. }else

精通Hibernate之映射继承关系六

在这种映射方式下,继承关系树的每个类以及接口都对应一个表.在本例中,需要创建EMPLOYEES.HE和SE表. 如图14-6所示,EMPLOYEES表仅包含和Employee类的属性对应的字段,HE表仅包含和HourlyEmployee类的属性对应的字段,SE表仅包含和SalariedEmployee类的属性对应的字段.此外,HE表和SE表都以EMPLOYEE_ID字段作为主键,该字段还同时作为外键参照EMPLOYEES表. <id name="id" type="lo

精通Hibernate之映射继承关系三

<hibernate-mapping > <class name="mypack.SalariedEmployee" table="SALARIED_EMPLOYEES"> <id name="id" type="long" column="ID"> <generator class="increment"/> </id> &l

精通Hibernate之映射继承关系二

把每个具体类映射到一张表是最简单的映射方式.如图14-2所示,在关系数据模型中只需定义COMPANIES.HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表.为了叙述的方便,下文把HOURLY_EMPLOYEES表简称为HE表,把SALARIED_EMPLOYEES表简称为SE表. HourlyEmployee类和HE表对应,HourlyEmployee类本身的rate属性,以及从Employee类中继承的id属性和name属性,在HE表中都有对应的字段.此外,Hourly

精通Hibernate之映射继承关系五

本节的范例程序位于配套光盘的sourcecode\chapter14\14.2目录下,运行该程序前,需要在SAMPLEDB数据库中手工创建COMPANIES表和EMPLOYEES表,然后加入测试数据,相关的SQL脚本文件为/14.2\schema\sampledb.sql. 在DOS命令行下进入chapter14根目录,然后输入命令: ant -file build2.xml run 就会运行BusinessService类.BusinessService的main()方法调用test()方法,

【HIBERNATE框架开发之七】HIBERNATE使用ANNOTATION中各种关系映射的CRUD(增删改查)&amp;&amp;集合映射&amp;&amp;继承映射

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/822.html       首先对于Annotation中CRUD的C(Create)操作:-------- 假设 :   User (MonyToOne)       Group OK,那么有如下 Junit Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Conf

菜鸟问一个hibernate关于继承关系映射的配置问题

问题描述 菜鸟问一个hibernate关于继承关系映射的配置问题 按照教学视频配置: <class name="Employee" discriminator-value = "0"> <id name="id"> <generator class="native"></generator> </id> <property name="name&quo