Hibernate的三种继承映射

这里写图片描述
一:用一张表映射
people.java
这里写图片描述

public class People {
    private int id;
    private String name;
    private String workage;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getWorkage() {
        return workage;
    }
    public void setWorkage(String workage) {
        this.workage = workage;
    }
}

YoungPerson.java

public class YoungPerson extends People{
    /*
    *助学基金
    */
    private String studentgrant;

    public String getStudentgrant() {
        return studentgrant;
    }

    public void setStudentgrant(String studentgrant) {
        this.studentgrant = studentgrant;
    }

}

AdultPerson.java

public class AdultPerson extends People{
    /*
    *工资
    */
    private String adultsalary;

    public String getAdultsalary() {
        return adultsalary;
    }
    public void setAdultsalary(String adultsalary) {
        this.adultsalary = adultsalary;
    }

}

OldPerson.java

public class OldPerson extends People{
    /*
    *养老金
    */
    private String  annuity;

    public String getAnnuity() {
        return annuity;
    }

    public void setAnnuity(String annuity) {
        this.annuity = annuity;
    }
}

people.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="hibernatedemo1.pojo">
    <class name="People" table="people">
        <id name="id">
            <generator class="increment"></generator>
        </id>   
        <!-- 指定一个鉴别器 -->  
      <discriminator type="string" column="style"></discriminator> 
        <property name="name"/>
        <property name="workage"/>
        <!-- discriminator-value:识别子类 -->
         <subclass name="YoungPerson" discriminator-value="Y">
            <property name="studentgrant" ></property>
        </subclass>
        <subclass name="AdultPerson" discriminator-value="a">
            <property name="adultsalary" ></property>
        </subclass>
        <subclass name="OldPerson" discriminator-value="O">
            <property name="annuity" ></property>
        </subclass> 
    </class>
</hibernate-mapping>

测试类;
Demo.java

public class demo(){
    Configuration cfg = new Configuration().configure();
        ServiceRegistry registry = new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties()).build();
        SessionFactory sf=cfg.buildSessionFactory(registry);
        //代开session(建立和数据库之间的连接)
        Session session=sf.openSession();
        //开始事物
        Transaction tx=session.beginTransaction();
        YoungPerson yp=new YoungPerson();
        yp.setName("小明");
        yp.setWorkage("9");
        yp.setStudentgrant("九年义务教育");
        session.saveOrUpdate(yp);

        AdultPerson ap=new AdultPerson();
        ap.setName("张霞");
        ap.setWorkage("28");
        ap.setAdultsalary("工资");
        session.saveOrUpdate(ap);

        OldPerson op=new OldPerson();
        op.setName("老明");
        op.setWorkage("60");
        op.setAnnuity("养老金");
        session.saveOrUpdate(op);

        tx.commit();
        session.close();
}

**二:继承映射的第二种方法:用多张表映射,每张表只有自己独立的信息,没有公共字段!
映射情景回顾以及各实体类在这里就不重复写了,(因为只有xml发生了改变)**
这里写图片描述这里写图片描述这里写图片描述这里写图片描述
people.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="hibernatedemo1.pojo">
    <class name="People" table="people">
        <id name="id">
            <generator class="increment"></generator>
        </id>   
        <!-- 指定一个鉴别器 -->  
      <discriminator type="string" column="style"></discriminator> 
        <property name="name"/>
        <property name="workage"/>
        <joined-subclass name="YoungPerson" table="youngperson">
            <key column="id"></key>
            <property name="studentgrant" ></property>
        </joined-subclass>
        <joined-subclass name="AdultPerson" table="adultperson">
            <key column="id"></key>
            <property name="adultsalary" ></property>
        </joined-subclass>
        <joined-subclass name="OldPerson" table="oldperson">
            <key column="id"></key>
            <property name="annuity" ></property>
        </joined-subclass>
        </class>
</hibernate-mapping>

**三:继承映射的第二种方法:用多张表映射,每张表都有公共字段!
映射情景回顾以及各实体类在这里就不重复写了,(因为只有xml发生了改变)**
people.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="hibernatedemo1.pojo">
    <class name="People" table="people">
        <id name="id">
            <generator class="increment"></generator>
        </id>   
        <property name="name"/>
        <property name="workage"/>
         <!--   
            当使用每个具体类一张表的方式时,主键生成策略不能是identity。  
            因为在整个继承结构中,主键值是不能重复的。  
            =================================================  
            假设如果是identity,那么在数据库中的主键是数据库自己生成的,那么在表中就可能会有一个ID等于1的Topic和ID等于1的Reply  
            假设现在用ID=1和Article类型查数据库,那么我们就不能知道这个查回来的是主题还是回复。因为这是继承多态的特性。  
            =================================================  
            但是在前面两种情况中都不会,因为他的主键是根据父类表Article生成的外键,是引用的,因此不会出现ID重复的情况。  
         -->  
        <union-subclass name="YoungPerson" table="youngperson">
            <property name="studentgrant" ></property>
        </union-subclass>
        <union-subclass name="AdultPerson" table="adultperson">
            <property name="adultsalary" ></property>
        </union-subclass>
        <union-subclass name="OldPerson" table="oldperson">
            <property name="annuity" ></property>
        </union-subclass> 
        </class>
</hibernate-mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值