热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

hibernate映射继承关系

实现方式一般有三种:1.继承关系树每个具体类对应一张表(不介绍)2.继承关系树的根类对应一张表3.继承关系树的每个类对应一张表先介绍关系:DayEmployee和MonthEmploy是Employee的子类,并且Company和Employee是一对多关系:具体代码如下:Compan

实现方式一般有三种: 1. 继承关系树每个具体类对应一张表(不介绍) 2. 继承关系树的根类对应一张表 3. 继承关系树的每个类对应一张表 先介绍关系: DayEmployee和MonthEmploy是Employee的子类,并且Company和Employee是一对多关系: 具体代码如下: Compan

实现方式一般有三种:
1. 继承关系树每个具体类对应一张表(不介绍)
2. 继承关系树的根类对应一张表
3. 继承关系树的每个类对应一张表

先介绍关系:
DayEmployee和MonthEmploy是Employee的子类,并且Company和Employee是一对多关系:

具体代码如下:

Company.java

import java.util.HashSet;
import java.util.Set;

public class Company {
    private Integer id;
    private String name;
    private Set employees = new HashSet();

    public Company() {
        super();
    }
    public Company(String name) {
        super();
        this.name = name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set getEmployees() {
        return employees;
    }
    public void setEmployees(Set employees) {
        this.employees = employees;
    }
}

Employee.java

    public class Employee {
    private Integer id;
    private String name;
    private Integer age;
    private Company company;
    public Company getCompany() {
        return company;
    }
    public void setCompany(Company company) {
        this.company = company;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

}

DayEmployee.java

public class DayEmployee extends Employee{
    private Double dayMoney;

    public Double getDayMoney() {
        return dayMoney;
    }
    public void setDayMoney(Double dayMoney) {
        this.dayMOney= dayMoney;
    }

}

MonthEmploy.java

    public class MonthEmploy extends Employee{
    private Double monthMoney;

    public Double getMonthMoney() {
        return monthMoney;
    }
    public void setMonthMoney(Double monthMoney) {
        this.mOnthMoney= monthMoney;
    }

}

Company.hbm.xml



<hibernate-mapping package="com.dongecs.test1.pojo">
    <class name="Company" table="COMPANY">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        property>
        <set name="employees" table="EMPLOYEE" inverse="true" lazy="true">
            <key>
                <column name="COMPANY" />
            key>
            <one-to-many class="Employee" />
        set>
    class>
hibernate-mapping>

继承关系树的根类对应一张表对应的Employee.hbm.xml的写法

Employee.hbm.xml



<hibernate-mapping package="com.dongecs.test1.pojo">
    
    <class name="Employee" table="EMPLOYEE" discriminator-value="emp">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        id>
       
        <discriminator column="empType" type="string"/>

        <property name="name" type="java.lang.String">
            <column name="NAME" />
        property>
        <property name="age" type="java.lang.Integer">
            <column name="AGE" />
        property>
        <many-to-one name="company" class="Company" fetch="join">
            <column name="COMPANY" />
        many-to-one>
       
        <subclass name="DayEmployee" discriminator-value="DE">
            <property name="dayMoney" type="double">property>
        subclass>
         
        <subclass name="MonthEmploy" discriminator-value="ME">
            <property name="monthMoney" type="double">property>
        subclass>
    class>
hibernate-mapping>

利用上述代码作如下测试:

public class EmployeeTest {

    SessionFactory sessiOnFactory= null;
    Session session = null;
    Transaction transaction = null;

    @Before
    public void init() {
        Configuration cOnfiguration= new Configuration().configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
                .buildServiceRegistry();
        sessiOnFactory= configuration.buildSessionFactory(serviceRegistry);
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }

    @After
    public void after() {
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

    @Test
    public void testEmployee() {
        Company company = new Company("com1");

        DayEmployee d1 = new DayEmployee();
        d1.setAge(22);
        d1.setDayMoney(50.0);
        d1.setName("d1");

        MonthEmploy d2 = new MonthEmploy();
        d2.setAge(30);
        d2.setMonthMoney(79.0);
        d2.setName("d2");

        Employee employee = new Employee();
        employee.setAge(90);
        employee.setName("employee");

        d1.setCompany(company);
        d2.setCompany(company);
        employee.setCompany(company);

        //inverse = true 时可以关联, 当相对多出3条update,因此建议使用多的一端关联
//      company.getEmployees().add(employee);
//      company.getEmployees().add(d1);
//      company.getEmployees().add(d2);

        //把一的一段放到最前保存,可以减小3条更新操作
        session.save(company);

        session.save(employee);
        session.save(d2);
        session.save(d1);
    }
}

会得出如下结果:
这里写图片描述

继承关系树的每个类对应一张表Employee.hbm.xml的写法



<hibernate-mapping package="com.dongecs.test1.pojo">
    <class name="Employee" table="EMPLOYEE">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        id>

        <property name="name" type="java.lang.String">
            <column name="NAME" />
        property>
        <property name="age" type="java.lang.Integer">
            <column name="AGE" />
        property>
        <many-to-one name="company" class="Company" fetch="join">
            <column name="COMPANY" />
        many-to-one>
        
        <joined-subclass name="MonthEmploy" table="MONEMPLOY">
            <key column="EMPLOYEE_ID">key>
            <property name="monthMoney" type="double">property>
        joined-subclass>
        <joined-subclass name="DayEmployee" table="DAYEMPLOY">
            <key column="EMPLOYEE_ID">key>
            <property name="dayMoney" type="double">property>
        joined-subclass>
    class>
hibernate-mapping>

测试代码:

public class EmployeeTest {

    SessionFactory sessiOnFactory= null;
    Session session = null;
    Transaction transaction = null;

    @Before
    public void init() {
        Configuration cOnfiguration= new Configuration().configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
                .buildServiceRegistry();
        sessiOnFactory= configuration.buildSessionFactory(serviceRegistry);
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }

    @After
    public void after() {
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

    @Test
    public void testEmployee() {
        Company company = new Company("com1");

        DayEmployee d1 = new DayEmployee();
        d1.setAge(22);
        d1.setDayMoney(50.0);
        d1.setName("d1");

        MonthEmploy d2 = new MonthEmploy();
        d2.setAge(30);
        d2.setMonthMoney(79.0);
        d2.setName("d2");

        Employee employee = new Employee();
        employee.setAge(90);
        employee.setName("employee");

        d1.setCompany(company);
        d2.setCompany(company);
        employee.setCompany(company);

        //inverse = true 时可以关联, 当相对多出3条update,因此建议使用多的一端关联
//      company.getEmployees().add(employee);
//      company.getEmployees().add(d1);
//      company.getEmployees().add(d2);

        //把一的一段放到最前保存,可以减小3条更新操作
        session.save(company);

        session.save(employee);
        session.save(d2);
        session.save(d1);
    }

    @Test
    public void findFromEmployeeTable(){
        String hql = "from Employee";
        //通过左外链接找
        List list = session.createQuery(hql).list();
        for (Employee emp : list){
            if (emp instanceof DayEmployee){
                System.out.println("day");
            } else if (emp instanceof MonthEmploy){
                System.out.println("mon");
            } else {
                System.out.println("emp");
            }
        }
    }

    @Test
    public void findFromDayEmployeeTable(){
        String hql = "from DayEmployee";
        //通过内连接找
        List list = session.createQuery(hql).list();
        System.out.println(list.size());
    }
}

得出如下结果:
这里写图片描述
这里写图片描述

结论:

1.使用根类对应一张表
好处:只需创建一张表,不用外键关联
缺点:如果子类属性多,会导致另一子类有过多的空值,而且不能设置一些字段的not null约束,因此不能保证数据库的完整性
2.每个类对应一张表(外键关联)
好处:如果某个类的属性发生变化,只需修改和这个类对应的表
缺点:利用外键关联查询

ref:

孙卫琴.精通Hibernate:Java对象持久化技术详解


推荐阅读
  • 深入解析AUTOSAR方法论:汽车电子系统开发的理论基础(第三部分)
    本文详细探讨了AUTOSAR方法论在汽车电子软件系统开发中的应用,涵盖了从系统配置到生成可执行代码的各个关键步骤。通过介绍各阶段的任务和工具支持,帮助读者全面理解AUTOSAR的设计流程。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 优化Jenkins首次启动速度
    本文详细描述了在启动Jenkins后遇到的长时间加载问题,并提供了一种通过修改更新中心配置文件来显著提升启动速度的有效解决方案。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • 本文探讨了如何在Java中使用JAXB解组两个具有相同名称但不同结构的对象。我们将介绍一个抽象类Bar及其具体实现,并展示如何正确地解析XML文档以获取正确的对象实例。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
  • Servlet过滤器入门:实现与配置
    本文介绍如何在Java Web应用中实现和配置Servlet过滤器,通过实现`javax.servlet.Filter`接口来创建过滤器,并详细说明其在web.xml文件中的配置方法。 ... [详细]
author-avatar
梁义鹏e
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有