组件映射

建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系。

以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息单独放在一张表中,

然后建立员工信息表和地址信息表之间的外键参照关系,当每次查询员工信息时,都需建立者两个表的连接。

建立表的连接是很耗时的操作,为了提高数据库运行性能,可以把这两张表的信息整合在一张员工信息表EMPINFO中。

图为:EMPLNFO表结构

Empinfo类和EmpHomeAddress类的整体和部分的关系

步骤一:创建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>

步骤三:书写测试类

@Test
	  public void testAdd(){
		   Session session = HibernateUtil.getSession();
		   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!!!");
	  }

  

时间: 2024-10-05 12:18:13

组件映射的相关文章

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

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

Hibernate学习笔记_关系映射

    一对一关联     一,     一对一单向外键关联 a)    Annotation: 在被约束表字段的get方法上加@0ne20ne @JoinColumn //Husband .java @Entity public class Husband { private int id; private String name; private Wife wife; @Id @GeneratedValue public int getId() { return id; } public S

Hibernate学习笔记(八) — 懒加载与抓取策略

懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用.总结一句话:什么时候需要数据,什么时候加载. 一.懒加载 1.1 类的懒加载 由javassist产生的代理类与Classes类是继承关系, session.load()方法产生的是代理对象,该代理类是持久化类的子类 /** * 类的懒加载 */ @Test public void testClass_l

Hibernate学习笔记_关系映射_其他

集合映射(不太重要) 1         Set 2        List (与Set差不多 多个@OrderBy) a) @OrderBy     排序 private List<User> users = new ArrayList<User>(); @OneToMany(mappedBy="group", cascade={CascadeType.ALL} ) @OrderBy("name ASC") public List<U

Hibernate学习笔记_关系映射_树状结构练习

1         树状结构的设计(至关重要) a) 在同—个类中使用One2Many和Many20ne @Entity public class Org { private int id; private String name; private Set<Org> children=new HashSet<Org>(); private Org parent; @Id @GeneratedValue public int getId() { return id; } public

《Hibernate学习笔记之三》:联合主键的映射

<Hibernate学习笔记之三>:联合主键的映射 就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做?? 联合主键的映射有两种方式来进行实现. 1.使用映射文件 XXX.bhm.xml 2.使用Annotation Hibernate首先需要使用联合主键的实体类必须实现Serializable接口,即为了使序列能够被序列化进行传输

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

Hibernate学习笔记:第一个程序的搭建

Hibernate学习笔记:第一个程序的搭建 前一段时间对Struts2这个框架有了一点点地了解,很高兴,自己开始学习Hibernate这个框架了.本篇博文将记录下第一个Hibernate程序的搭建过程.其实有时候个人觉得无论我们学习什么语言也好,还是学习什么框架也好,第一个HelloWorld程序真的相当重要,假如 我们在学习第一个HelloWorld程序都跑不出来,这完全影响着我们对新接触的东西的兴趣和动力,但是,往往第一个程序都会涉及到很多的配置,因此使得对于初学者要摸索一定的时间,对于我

hibernate学习笔记之四(Hibernate中的类型)

(hibernate学习笔记系列来自于 "疯狂Java" Hibernate视频学习) Hibernate中的类型 在*.hbm.xml文件中,<property name="password" column="t_pass">,hibernate根据type转换将java转换成hibernate类型,然后再转换成SQL类型,<property name="password" type="...&q

Hibernate学习笔记(3)

两年前曾经学习过Hibernate,也通过博客将Hibernate的学习过程记录下来了,地址如下: Hibernate学习笔记(1) Hibernate学习笔记(2) 最近在复习Hibernate,在重新学习的过程中,有了一些新的体会和收获,现在将其总结成博客,供以后作为参考资料使用. 一.导入相应的jar包 目前Hibernate更新到了4.x版本,在官网下载后,找到lib文件加中的required文件夹,此外还需要额外导入log4j和数据库驱动包. 二.创建Hibernate配置文件 在sr