继承关系映射--joined-subclass 元素映射继承关系

本文介绍了Hibernate中使用joined-subclass元素映射数据库中的继承关系。数据库设计采用每个子类一张表的方式,例如:一个基本car表,一个lorry表和一个salooncar表。子类表通过主键与父类表建立关联,子类表仅包含新增属性。在映射文件中定义继承关系,使得Hibernate能够支持多态操作。这种方式下,车辆的完整信息由对应的基本car表和子类表记录共同构成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先是数据库的设计有三种 这里讲述其中一种

数据库设计:

(2)例如:每个子类一张表:一个lorry表,一个salooncar表,父类还有一个basiccar表。


 每个类一个数据表,使用 joined-subclass 元素映射继承关系
        对于这种设计,父类和子类都需要定义数据表,在子类的数据表中
定义新增的属性,并且父类和子类使用主键来设置它们的关联关系。在映射文件中也定义继承关系的对象映射关系,所以Hibernate能知道这种继承关系,因此支持多态。
        这种方式创建的数据表中,子类表的主键也是外键,引用其父类表的主键。

    

basiccar表只包含父类属性的字段,lorry表和salooncar表只包含子类新增属性的字段。lorry表和salooncar表都以carid字段(可以不同名)作为主键,同时也作为外键关联basic表。这种建表方式,当存储某个车型的数据时,这辆车的父类属性数据先存放在basiccar表中,属于具体车型的子类新增属性数据再存放在对应的子类表中。一辆卡车的完整信息需要id值和carid值相同的basiccar表和lorry表的记录共同组成

使用这种继承关系的实现方式,Hibernate只需要一个父类的映射文件BasicCar.hbm.xml,映射文件如下:

<?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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="BasicCar" table="basiccar" 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>
        <joined-subclass name=“Lorry” table=“lorry”>
               <key coloumn = “carid”/>
               <property name = “loadweight” column = “loadweight” type =
                   “java.lang.Double”></property>
        </joined-subclass> 
        <joined-subclass name=“SaloonCar” table=“salooncar”>
              <key coloumn = “carid”/>
              <property name = “loadpersons” column = “loadpersons” type =
                   “java.lang.Integer”></property>
        </joined-subclass> 
    </class>
</hibernate-mapping>
  由映射文件可知,首先定义BasicCar的属性与字段映射关系,然后通过<joined-subclass>元素定义子类的继承映射。<joined-subclass>元素包含一个<key>子元素,用以声明子类表中既作为主键又作为外键的字段,通过该字段将子类表和父类表关联。
        这种继承映射支持多态查询。要查找所有的车型数据需执行:List cars = session.find(“from BasicCar”); 相当于同时检索lorry表和salooncar表,并执行与basiccar表的内连接。要查找所有的Lorry车型数据则执行:List cars = session.find(“from Lorry”);  只在Lorry表查询,并执行与basiccar表的内连接。执行内连接是为了获取父类BasicCar的属性数据。保存某个车型执行:BasicCar car = new Lorry(“xxx”, “Shanghai”, Date.valueof(“2016-03-14”), 10);    session.save(car); 则父类BasicCar的属性数据存放在父类表中,子类Lorry新增的属性数据存放在子类表中。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值