zoukankan      html  css  js  c++  java
  • Hibernate的继承映射

    何为继承映射:

    继承映射:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念。Hibernate 的继承映射可以理解持久化类之间的继承关系。例如:人和学生之间的关系。学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到。

    继承映射的分类:Hibernate支持三种继承映射策略:

    使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态。(数据看起来会很模糊,因为子类和父类的数据都放在同一张表)

    使用 joined-subclass 进行映射:对于继承关系中的子类使用同一个表,这就需要在数据库表中增加额外的区分子类类型的字  段。(子类和父类共有的数据放在父类表,那子类特有的数据放在子类表,但是如果单单看子类表时 是不是无法获得全部数据 吖,)

    使用 union-subclass 进行映射:域模型中的每个类映射到一个表,通过关系数据模型中的外键来描述表之间的继承关系。这也    就相当于按照域模型的结构来建立数据库中的表,并通过外键来建立表之间的继承关系。(子类和父类的数据都分别存放在子类和父类的表中,这样存放数据是不是简单明了吖,所以一般推荐使用这个)

    但是在实际的开发中,我们一般不推荐使用继承映射,因为表与表之间的关系,不应该那么复杂,这样很难维护

    所以我们当做了解知识即可,有时候可能也需要用到

    那这种继承映射是怎样实现的呢??(person与student这两者就是继承的关系,以这两个来举例)

    I subclass实现

    1新建person类和student类

    代码如下:

    package com.atguigu.hibernate.subclass;

    public class person {
    private Integer ID;
    private String Name;
    public Integer getID() {
    return ID;
    }
    public void setID(Integer iD) {
    ID = iD;
    }
    public String getName() {
    return Name;
    }
    public void setName(String name) {
    Name = name;
    }

    }
    student:

    package com.atguigu.hibernate.subclass;

    public class Student extends person {
    private Integer ID;
    private String School;
    public Integer getID() {
    return ID;
    }
    public void setID(Integer iD) {
    ID = iD;
    }
    public String getSchool() {
    return School;
    }
    public void setSchool(String school) {
    School = school;
    }

    }
    1生成父类的.hbm.xml文件,也就是生成person.hbm.xml文件,在这文件中配置discriminator和subclass

    代码如下:
        

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2014-10-9 15:26:08 by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping>

    <class name="com.atguigu.hibernate.subclass.person" table="PERSON" discriminator-value="person">
    <!-- 这里这个discrimination-value:代表的是当插入父类时,识别列的值是person-->
    <id name="ID" type="java.lang.Integer">
    <column name="ID" />
    <generator class="native" />
    </id>
        <!-- 这里的discriminator标签的意思是,插入一个识别列,列的数据类型是String-->
    <discriminator type="string" column="TYPE" ></discriminator>
    <property name="Name" type="java.lang.String">
    <column name="NAME" />
    </property>

    <!-- 映射子类 Student, 使用 subclass 进行映射 -->
    <!-- name:指定子类的类名(全类名也可以),discriminationValue是指定插入这个子类时type类型的值, -->
    <!-- property的name:子类特有的属性,在父类中列名叫什么 -->

        <!-- 这里这个discrimination-value:代表的是当插入子类时,识别列的值是student-->

    <subclass name="com.atguigu.hibernate.subclass.Student" discriminator-value="STUDENT">
    <property name="school" type="string" column="SCHOOL"></property>
    </subclass>

    </class>
    </hibernate-mapping>
    以上就是subclass的继承映射

    II joined-subclass(就是子类与父类相同的字段放在父类,子类特有的字段放在子类,并且子类的主键要根据父类生成)

    III union-subclass(子类和父类的字段都分开放,但是主键的生成方式不能使identity,)

  • 相关阅读:
    九九乘法表
    计算器界面
    3.2封装的日期类
    杨辉三角
    100以内的素数
    九九 乘法表
    七、logging模块
    六、MySQLdb 模块
    四、浏览器运行模式
    五、configparser模块
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4014326.html
Copyright © 2011-2022 走看看