hibernate中继承映射保存

1 简单继承映射,在子类上进行映射配置,可以将父类属性直接配置在子类映射文件中。

简单例子如下:teacher类继承自Person类。

public class Person {
    private int id;
    private String pname;

    public Person() {
        // TODO Auto-generated constructor stub
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }

}

Teacher

public class Teacher extends Person {
    private String tschoolName;

    public Teacher() {
        // TODO Auto-generated constructor stub
    }

    public String getTschoolName() {
        return tschoolName;
    }

    public void setTschoolName(String tschoolName) {
        this.tschoolName = tschoolName;
    }
}

Teacher.hbm.xml配置文件

<hibernate-mapping
    package="com.baidu.entity3">

    <class name="Teacher" table="teacher">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>

        <property name="pname" column="name"></property>
        <property name="tschoolName" column="schoolName"></property>

    </class>
</hibernate-mapping>

简单测试

public void fun1(){
        Teacher teacher = new Teacher();
        teacher.setPname("good");
        teacher.setTschoolName("南洋理工");

        Configuration configuration = new Configuration();
        configuration.configure();
        SessionFactory sessionFac = configuration.buildSessionFactory();
        Session session = sessionFac.openSession();
        Transaction bt = session.beginTransaction();

        session.save(teacher);
        bt.commit();

        session.close();
        sessionFac.close();

    }

2 所有类使用一张表,使用subclass属性。注意需要使用类鉴别器,这种设计方法不太符合数据库表的设计原则,会用很多空的字段产生。

继续上面的例子,新产生一个类,Engineer

public class Engineer extends Person {

    private String ecompName;

    public Engineer() {
        // TODO Auto-generated constructor stub
    }

    public String getEcompName() {
        return ecompName;
    }

    public void setEcompName(String ecompName) {
        this.ecompName = ecompName;
    }
}

此时配置文件只在父类Person.hbm.xml映射文件中做

<hibernate-mapping
    package="com.baidu.entity3">

    <class name="Person" table="person">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <discriminator column="type"></discriminator>
        <property name="pname" column="name"></property>

        <subclass name="Teacher" discriminator-value="teacher_">
            <property name="tschoolName" column="schoolName"></property>
        </subclass>

        <subclass name="Engineer" discriminator-value="engineer_">
            <property name="ecompName" column="eompanyName"></property>
        </subclass>

    </class>

</hibernate-mapping>

注意需要使用鉴别器,discriminator位置在id属性下面,property上面。每个子类使用subclass标签区分,需要指定discriminator-value属性,表明该类属于那个类别。

3 每个类使用一张表,属性关键字joined-subclass,也是在父类的配置文件上Person.hbm.xml配置

<hibernate-mapping
    package="com.baidu.entity3">

    <class name="Person" table="person">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <discriminator column="type"></discriminator>
        <property name="pname" column="name"></property>

         <joined-subclass name="Engineer" table="engineer">
             <key column="id"></key>
             <property name="ecompName" column="companyName"></property>
         </joined-subclass>

       <joined-subclass name="Teacher" table="teacher">
             <key column="id"></key>
             <property name="tschoolName" column="schoolName"></property>
         </joined-subclass>
    </class>

</hibernate-mapping>

注意:因为每个子类都要生成一张表,因此在使用joined-subclass的时候需要指定table属性来指定使用那张表。

4 所有子类使用一张表,属性关键字union-subclass。注意这种方式主键的生成方式不可以使用自增长,可以使用uuid。配置文件还是在Person.hbm.xml配置

<hibernate-mapping
    package="com.baidu.entity3">

    <class name="Person" table="person">
        <id name="id" column="id">
            <generator class="uuid"/>
        </id>
        <discriminator column="type"></discriminator>
        <property name="pname" column="name"></property>

        <union-subclass name="Engineer" table="engineer">
             <property name="ecompName" column="companyName"></property>
         </union-subclass>

         <union-subclass name="Teacher" table="teacher">
             <property name="tschoolName" column="schoolName"></property>
         </union-subclass>
    </class>

</hibernate-mapping>
时间: 2024-10-05 08:09:58

hibernate中继承映射保存的相关文章

hibernate之继承映射

面向对象中有继承的概念,而关系型数据库却没有表与表之间的继承关系.解决思路有三种: 1.  继承关系层次一个表: 含义:使用一个表保存同一继承层次中的所有类,加额外字段来表示所属子类. 优点:多态查询,查询父类和所有子类数据时只需一次简单的查询,性能最佳: 缺点:在数据库表里添加各个区分子类的字段. 适用:需要多态查询,且子类的属性较少. 2.  每个具体类一个表: 含义:父类抽象化不对应一个表,每个子类对应一个表(每个子表包括父和子所有字段). 优点:实现的继承映射最简单. 缺点:多态查询持久

Hibernate的继承映射

何为继承映射: 继承映射:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. 继承映射的分类:Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态.(数据看起来会很模糊,因为子类和父类的数据

Hibernate中的映射关系(一对多)

在数据库中表和表之间的关系有几种,下面就详细说一下在Hibernate中怎样映射一对多的关系 Hibernate映射一对多的关系,其实就是持久类之间的映射,那如何把持久类关联起来呢??那就用到.hbm.xml文件的<many-to-one>标签了 具体做法如下: 新建一个customer类: package com.jeremy.hibernate.app.example; public class Customer { private Integer customerId; private

hibernate笔记--继承映射关系的三种实现方式

单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映射来建表,最后生成的表是这样的: 可以看到我们只需要建立一张表就可以维护这个关系,这种方式就是单表继承映射,下面介绍配置方法: 新建实体类Person ,Student,和Teacher : public class Person { private int id; private String n

ORM进阶之Hibernate中关系映射

ORM进阶之 ORM简介 ORM进阶之Hibernate简介及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 ORM进阶之Hibernate中一对一的关系映射 映射可以说是在hibernate中非常重要的一个内容,通过映射可以让程序员不再思考复杂的sql语句,而是更加的专注于业务逻辑的实现.映射通过一个xml配置文件完成并且我们可以对他进行修改!下边我们来看一下如何完成映射的! 单表映射 每个实体对应一张表,跟其他的实体没有关联关系,这是最简

hibernate中关系映射

在数据库中数据的对应关系有一对一,一对多和多对一.那么在hibernate中应该如何对应呢?如下: 一对一: 假设两个实体,一个实体类为husband,另外一个实体类为wife.一个丈夫只能对应一个妻子,反之亦然.那么在hibernate中使用annotation如下:(husband类) 1 import javax.persistence.Entity; 2 import javax.persistence.GeneratedValue; 3 import javax.persistence

hibernate中的映射文件xxx.hbm.xml详解总结

转自 http://blog.csdn.net/a9529lty/article/details/6454924 一.hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁   二,Hibernate映射文件主要内容:     (1).映射内容的定义: Hibernate映射文件由<hibernate-mapping package="JavaBean所在包的全路径">节点定义映射内容并指定所对应的JavaBean的位置(

Hibernate中双向一对一保存数据的问题

private static void test10() { // 获得session 对象 SessionFactory sessionFactory = new Configuration().configure() .buildSessionFactory(); Session session = sessionFactory.openSession(); // session开启事务 session.beginTransaction(); // 创建 一对一 对象数据 PersonInf

hibernate 继承映射

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表