• Hibernate之组件映射


    1:为什么要使用组件映射

    答:建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系。以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息单独放在一张表中,然后建立员工信息表和地址信息表之间的外键参照关系,当每次查询员工信息时,都需建立者两个表的连接。建立表的连接是很耗时的操作,为了提高数据库运行性能,可以把这两张表的信息整合在一张员工信息表EMPINFO中。

    2:什么是组件映射组件是一个被包含的对象,它和它的所有者同存于一张表中,也就是说它仅仅是个值类型,而不是一个实体值类型和实体的区别在于值类型没有标识符,当然了持久化一个值类型也就不需要标识符属性

    详见代码:

    步骤一:

    创建JavaBean

    //步骤一:创建EmpHomeAddress和EmpInfo
    public class EmpHomeAddress {
        private String ehomestreet;
        private String ehomecity;
        private String ehomeprovince;
        private String ehomezipcode;
        private EmpInfo empinfo;
    }
    EmpInfo创建如下:
    public class EmpInfo {
        private Integer eid;
        private String ename;
        private EmpHomeAddress ehome;
    }

    步骤二:创建配置文件EmpInfo.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="cn.happy.component">
       <class name="EmpInfo" table="EMPINFO">
           <id name="eid" column="EID">
            <generator class="native"></generator>
           </id>
           <property name="ename" column="ENAME" type="string"></property>
           <component name="ehome" class="EmpHomeAddress">
              <parent name="empinfo"/>
              <property name="ehomestreet" column="EHOMESTREET" type="string"></property>
              <property name="ehomecity" column="EHOMECITY" type="string"></property>
              <property name="ehomeprovince" column="EHOMEPROVINCE" type="string"></property>
              <property name="ehomezipcode" column="EHOMEZIPCODE" type="string"></property>
           </component>
       </class> 
    </hibernate-mapping>

     在上面的EmpInfo.hbm.xml文件中,Address作为EmpInfo的组件被定义,共使用了两次,分别对应于EmpInfo的两个属性。根据配置文件知道,EmpInfo可以获得它的组件,儿Address却不能得到它的所有者,如果也想让Address得到它的所有者,可以在<component>中添加一个节点<parent name="EmpInfo",同时在Address的类中增加EmpInfo属性,并提供getter和setter方法即可使用如address.getEmpInfo()来操作EmpInfo类。

    步骤三:测试代码

    package Test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import util.HibernateUtil;
    import entity.EmpHomeAddress;
    import entity.EmpInfo;
    
    public class MyTest {
        @Test
        public void Test() {
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           EmpInfo emp=new EmpInfo();
           emp.setEname("张靓颖");
           //创建一个员工地址对象
           EmpHomeAddress address=new EmpHomeAddress();
           address.setEhomecity("北京");
           address.setEhomeprovince("北京");
           address.setEhomestreet("五道口");
           address.setEhomezipcode("100000");
           address.setEmpinfo(emp);
           emp.setEhome(address);
           session.save(emp);
           tx.commit();
           System.out.println("ok===");
        }
    }

    生成的sql语句以及表结构:

  • 相关阅读:
    命令行参数解析
    业务
    从0开始架构二
    从0开始架构读书笔记
    增加ldl
    工具论
    go的web框架的context回调的原理
    id生成器雪花算法和雪花算法的sony实现
    软件架构师应该知道的97件事(六)
    进程通信简介
  • 原文地址:https://www.cnblogs.com/chimingyang/p/5844084.html
Copyright © 2020-2023  润新知