Hibernate--继承映射

来源:互联网 发布:幸运飞艇源码下载 编辑:程序博客网 时间:2024/06/06 06:54

1 多个结构整合到一张表中
1.1 比如Person类为父类,Teacher类和Student类均继承中,讲三个类生产一张表。
表结构说明:
这里写图片描述

public class Person {    private Integer id;    private String name;//省略get与setpublic class Student extends Person{    private String work;//省略get与setpublic class Teacher extends Person{    private Integer salary;//省略get与set

映射文件:

<class name="Person" table="person">        <id name="id" type="integer" column="id">            <generator class="native"></generator>        </id>        <!-- 鉴别器 区分student金额teacher的-->        <!-- 应该放在id和composite的后面 -->                <discriminator column="type" type="string"/>        <property name="name"/>        <!-- 子类  discriminator-value设置一个值由框架里帮助我们生成-->        <subclass name="Student" discriminator-value="s">            <property name="work"/>        </subclass>        <!-- 子类 -->        <subclass name="Teacher" discriminator-value="t">            <property name="salary"/>        </subclass>    </class>

discriminator 标签为鉴别器,必须放在id和composite后,用来区分子类,各个子类中设置属性discriminator-value来区分具体子类。即为type赋值。
生产的表结构:
这里写图片描述
1.2 添加数据

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();        Transaction tx = session.beginTransaction();        Student student=new Student();        student.setId(1);        student.setName("小强");        student.setWork("写作业");        Teacher teacher=new Teacher();        teacher.setId(2);        teacher.setName("小张");        teacher.setSalary(1000);        session.save(student);        session.save(teacher);          tx.commit();

各个对象单独存储,框架根据配置文件中的配置discriminator-value自动为设置的区分字段赋值。
执行上述代码后产生的数据为:
这里写图片描述
特别要注意红色的方框框中的内容,都是框架根据配置文件中的内容来自动生成的。

2 每个具体类一张表
同样是三个类,一个父类Person,两个子类Teacher类、Student类。其中的属性同上。
配置 文件:

<!-- 定义abstract="true"后将假定该父类为抽象类,不会产生该表 -->    <class name="Person" table="person" abstract="true">        <id name="id" type="integer" column="id">            <generator class="assigned"></generator>        </id>        <property name="name"/>        <union-subclass name="Student" table="student">            <property name="work"/>        </union-subclass>        <union-subclass name="Teacher" table="teacher">            <property name="salary"/>        </union-subclass>    </class>

不允许在父类中使用标示生成策略,建议使用UUID、assigned。
将产生三张表,两个子类将会继承父类中的字段,生成的表结构:
这里写图片描述
插入数据:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();        Transaction tx = session.beginTransaction();        Student student=new Student();        student.setId(1);        student.setName("小强");        student.setWork("写作业");        Teacher teacher=new Teacher();        teacher.setId(2);        teacher.setName("小张");        teacher.setSalary(1000);        session.save(student);        session.save(teacher);          tx.commit();

3 每个子类一张表,
每一子类将会只存在在中已定义的字段。

<class name="Person" table="person" abstract="true">        <id name="id" column="id">            <generator class="assigned"></generator>        </id>        <discriminator column="type" type="string"/>        <property name="name"/>        <subclass name="Student" discriminator-value="s">            <join table="student">                <key column="id"/>                <property name="work"/>            </join>        </subclass>        <subclass name="Teacher" discriminator-value="t">            <join table="teacher">                <key column="id"/>                <property name="salary"/>            </join>        </subclass>    </class>

生成的表结构:
这里写图片描述

原创粉丝点击