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语句以及表结构:

时间: 2024-12-31 03:01:01

Hibernate之组件映射的相关文章

hibernate笔记--组件映射方法

假设我们需要保存学生student的信息,student中有一个address属性,我们知道像这种信息其值可能会有多个,就像一个人会有两个以上的手机号,这种情况在hibernate中应该这样配置: 新建一个Address类,我们假设每个学生最多能保存3个地址: public class Address { private String addr1; private String addr2; private String addr3; //get/set方法省略 } 新建student实体类:

(13)Hibernate组件映射

不相信自己的人 连努力的价值都没有. 类组合关系的映射,也叫做组件映射! 注意:组件类和被包含的组件类,共同映射到一张表! 需求: 汽车与车轮 生成的表:主键.汽车名称.轮胎大小.轮胎数量 Wheel.java package com.rk.hibernate.m_component; public class Wheel { private int count; private int size; public int getCount() { return count; } public v

hibernate中的组件映射

组件映射 1 项目:hibernate_1100_component 2 对象关系:一个对象是另外一个对象的一部分 3 数据库表:一张表 4 annotation: @ Embeddable @Embbeded 对象模型 Husband(id,name,wife) Wife(name,age) Annotation: 在Husband的wife属性上建立注解 @Embedded 表明该对象是从别的位置嵌入过来的,是不需要单独映射的表. 这种方式生成的表为husband(id,name,wifen

框架 day33 Hibernate,组件映射,继承映射,抓取(检索)策略-优化,检索方式总结

组件(组成)映射 例1: public class Person { private Integer pid; //OID 值 private String name; //第一种方案 private String homeAddr; private String homeTel; private String companyAddr; private String companyTel; ↑一般项目都都采用此方案() *通过面向对象角度,使用设计模式(组件|组合),将数据都抽取到一个对象中.将

hibernate组件映射

组件映射,一个类是另外一个类的一部分,比如学生证类是学生类的一部分,在表里的关系,学生证信息的学生表信息的一部分,此时就需要用组件映射, 本例中,wife是husband的一部分. Wife类: package com.oracle.hibernate; /** * wife是husband的一部分 * wife示husband属性表的一部分, *所以wife没有id */ public class Wife { /** * 注意wife类里的属性名不能和husband类里的属性名冲突 * 如果

Hibernate中一对一关联映射/组件映射

Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别完成以下持久化操作 (1)保存员工档案的同时分配给员工一个账号 (2)加载员工档案的同时加载账号信息 一:按照外键映射

《Hibernate学习笔记八》:组件映射

<Hibernate学习笔记八>:组件映射 前面介绍了一对一的单向.双向外键关联,例如,学生证和学生是一个一对一的关系.这篇博文主要是介绍下组件映射,即一个是另一个的一部分,例如,学生证的信息也可以作为学生信息的一部分,即在数据库中只存在学生一个表,而不是有学生和学生证两个表,并且这两个表中有一个一对一的关联关系. 如下: 有人或许会说,那我们就将学生和学生证的信息写在一个类中,则就不需要组件映射了,确实可以这样,但是,根据类的设计原则,我们一般都会将其设计为两个类,然后将学生证的信息作为一个

.Hibernate一对一映射与组件映射

1.按照外键映射(Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射) 实现需要: 创建实体类Users1和Resume1 public class Users1 { private Integer userid; private String username; private String userpass; private Resume1 resume1; } *********** public class Resume1 { private Integer

Hibernate的组件(Component)映射

在学习Hibernate框架时碰到了许多实际的问题,比如一个Name是由FirstName和LastName组成,或者说一个Address是有Province,City,County和The detailed address组成,那么这么复杂的属性作为实际设计中是不应该出现在一个类里,那么组件映射就出现了 下面展示组件映射的实例,User对象中的Name属性 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLI