`

精通hibernate学习笔记(5)[映射组成关系]

阅读更多

1、概念

1.1 聚集关系
  在域模型中,有些类由几个部分类组成,部分类的对象的生命周期依赖于整体类的对象的生命周期,当整体消失时,部分也就随之消失,这种整体与部分的关系被称为聚集关系。

1.2 组成关系
  如果部分只能属于特定的整体,这种聚集关系也叫做组成关系。
如:任何手足事整体与部分的关系,每双手只能属于特定的人。

2、粒度


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

3. 映射组成关系

建立域模型和关系数据模型有着不同的出发点。域模型是由程序代码组成的,通过细化持久化类的粒度可提高代码可重用性,简化编程。关系数据模型是由关系数据组成的。在存在数据冗余的情况下,需要把粗粒度的表拆分成具有外键参照关系的几个细粒度的表,从而节省存储空间;另一方面,在没有冗余数据的前提下,应该尽可能减少表的数目,简化表之间的参照关系,以便提高数据库的访问速度。

例:
映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping >

  <class name="mypack.Customer" table="CUSTOMERS" >
    <id name="id" type="long" column="ID">
      <generator class="increment"/>
    </id>

    <property name="name" type="string" >
        <column name="NAME" length="15" />
    </property>
   
    <component name="homeAddress" class="mypack.Address">
            <parent name="customer" />
            <property name="province" type="string" column="HOME_PROVINCE"/>
            <property name="city" type="string" column="HOME_CITY"/>
            <property name="street" type="string" column="HOME_STREET"/>
            <property name="zipcode" type="string" column="HOME_ZIPCODE"/>
    </component>
       
    <component name="comAddress" class="mypack.Address">
           <parent name="customer" />
           <property name="province" type="string" column="COM_PROVINCE"/>
           <property name="city" type="string" column="COM_CITY"/>
           <property name="street" type="string" column="COM_STREET"/>
           <property name="zipcode" type="string" column="COM_ZIPCODE"/>
    </component>
  </class>

</hibernate-mapping>

<component>元素表明homeAddress属性是Customer类的一个组成部分,在hibernate中称之为组件.
<parent>子元素指定Address类所属的整体类,应定义为Address中的一个属性,同时对应的getter、setter方法。
<property>子元素用来配置组件类的属性和表的字段的映射。

3.1 区分值(Value)类型和实体(Entity)类型

上面Address类的定义如下:
package mypack;

import java.io.Serializable;
import org.apache.commons.lang.builder.ToStringBuilder;


/** @author Hibernate CodeGenerator */
public class Address implements Serializable {

    /** nullable persistent field */
    private String province;

    /** nullable persistent field */
    private String city;

    /** nullable persistent field */
    private String street;

    /** nullable persistent field */
    private String zipcode;

    /** nullable persistent field */
    private mypack.Customer customer;

    /** full constructor */
    public Address(String province, String city, String street, String zipcode, mypack.Customer customer) {
        this.province = province;
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
        this.customer = customer;
    }

    /** default constructor */
    public Address() {
    }

    public String getProvince() {
        return this.province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return this.street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getZipcode() {
        return this.zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    public mypack.Customer getCustomer() {
        return this.customer;
    }

    public void setCustomer(mypack.Customer customer) {
        this.customer = customer;
    }

    public String toString() {
        return new ToStringBuilder(this)
            .toString();
    }

}

可以发现Address类没有OID,这是Hibernate组件的一个重要特征,没有OID也就不能通过Session来单独管理,否则会抛出MappingException。
    持久化类分为两种,值类型和实体类型,最重要的区别是前者没有OID,不能被单独持久化,他的生命周期依赖于所属的持久化类对象的生命周期,组件类型就是一种值类型。

4、映射复合组成关系

配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping >

  <class name="mypack.Computer" table="COMPUTERS" >
    <id name="id" type="long" column="ID">
      <generator class="increment"/>
    </id>

    <property name="type" type="string" >
        <column name="COMPUTER_TYPE" length="15" />
    </property>
   
    <component name="cpuBox" class="mypack.CpuBox">
            <parent name="computer" />
           
            <property name="type" type="string" >
                <column name="CPUBOX_TYPE" length="15" />
            </property>
           
            <component name="graphicsCard" class="mypack.GraphicsCard">
               <parent name="cpuBox" />
             
               <property name="type" type="string" >
                  <column name="GRAPHICSCARD_TYPE" length="15" />
               </property>

            </component>

            <many-to-one
                name="vendor"
                column="CPUBOX_VENDOR_ID"
                class="mypack.Vendor"
                not-null="true"
            />
    </component>
  </class>


</hibernate-mapping>

定义:
package mypack;

import java.io.Serializable;
import org.apache.commons.lang.builder.ToStringBuilder;


/** @author Hibernate CodeGenerator */
public class Computer implements Serializable {

    /** identifier field */
    private Long id;

    /** nullable persistent field */
    private String type;

    /** persistent field */
    private mypack.CpuBox cpuBox;

    /** full constructor */
    public Computer(String type, mypack.CpuBox cpuBox) {
        this.type = type;
        this.cpuBox = cpuBox;
    }

    /** default constructor */
    public Computer() {
    }

    /** minimal constructor */
    public Computer(mypack.CpuBox cpuBox) {
        this.cpuBox = cpuBox;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getType() {
        return this.type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public mypack.CpuBox getCpuBox() {
        return this.cpuBox;
    }

    public void setCpuBox(mypack.CpuBox cpuBox) {
        this.cpuBox = cpuBox;
    }

    public String toString() {
        return new ToStringBuilder(this)
            .append("id", getId())
            .toString();
    }

}
package mypack;

import java.io.Serializable;
import org.apache.commons.lang.builder.ToStringBuilder;


/** @author Hibernate CodeGenerator */
public class CpuBox implements Serializable {

    /** nullable persistent field */
    private String type;

    /** nullable persistent field */
    private mypack.Computer computer;

    /** persistent field */
    private mypack.Vendor vendor;

    /** persistent field */
    private mypack.GraphicsCard graphicsCard;

    /** full constructor */
    public CpuBox(String type, mypack.Computer computer, mypack.Vendor vendor, mypack.GraphicsCard graphicsCard) {
        this.type = type;
        this.computer = computer;
        this.vendor = vendor;
        this.graphicsCard = graphicsCard;
    }

    /** default constructor */
    public CpuBox() {
    }

    /** minimal constructor */
    public CpuBox(mypack.Vendor vendor, mypack.GraphicsCard graphicsCard) {
        this.vendor = vendor;
        this.graphicsCard = graphicsCard;
    }

    public String getType() {
        return this.type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public mypack.Computer getComputer() {
        return this.computer;
    }

    public void setComputer(mypack.Computer computer) {
        this.computer = computer;
    }

    public mypack.Vendor getVendor() {
        return this.vendor;
    }

    public void setVendor(mypack.Vendor vendor) {
        this.vendor = vendor;
    }

    public mypack.GraphicsCard getGraphicsCard() {
        return this.graphicsCard;
    }

    public void setGraphicsCard(mypack.GraphicsCard graphicsCard) {
        this.graphicsCard = graphicsCard;
    }

    public String toString() {
        return new ToStringBuilder(this)
            .toString();
    }

}

 

分享到:
评论

相关推荐

    ( Hibernate 学习笔记.rar )面试资料

    【Hibernate 学习笔记】是针对Java开发人员的一份面试准备资料,主要涵盖了J2EE企业级应用开发中的重要框架Hibernate。...对于J2EE开发者来说,精通Hibernate框架无疑能增加求职的成功率,特别是在高新技术领域。

    Hibernate -annotation 学习笔记

    【Hibernate - Annotation 学习笔记】 Hibernate 是一个流行的开源Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据存储。Annotation是Hibernate提供的一种元...

    精通hibernate数据库编程

    本教程结合了【Hibernate学习笔记】,提供了全面且深入的讲解,旨在让学习者对Hibernate有透彻的理解并能熟练应用。 首先,Hibernate的核心概念是对象关系映射,它将数据库表与Java类关联,通过面向对象的方式来...

    java从入门到精通全过程笔记.doc

    JDBC是Java连接数据库的标准API,Hibernate则简化了对象关系映射,让开发者可以更专注于业务逻辑而非数据库操作。PL/SQL是Oracle数据库的编程语言,用于编写存储过程和触发器。 Web、JSP和Servlet技术是构建动态...

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    java从入门到精通全过程笔记

    Hibernate是一个对象关系映射框架,简化了数据库操作。PL/SQL是Oracle数据库的编程语言,用于编写存储过程和触发器。了解这些技术对于开发基于Java的数据驱动应用至关重要。 【Web开发】 Web开发中,JSP(Java...

    Hibernate_PDF_超好

    首先,"精通Hibernate(孙卫琴).pdf"是孙卫琴老师的著作,该书系统地介绍了Hibernate的核心概念和实战技巧。书中涵盖的内容包括:Hibernate概述、环境配置、实体类与表的映射、对象状态管理、持久化操作、查询语言...

    Hibernate开发资料

    3. **精通Hibernate读书笔记.doc**: 这份笔记可能是一位资深开发者的学习心得,可能包含了实战案例、最佳实践以及常见问题的解决方案。笔记通常更加实用,能帮助读者在实际项目中快速解决问题,提高开发效率。 4....

    北圣思园Hibernate源代码及课件

    【标题】"北圣思园Hibernate源代码及课件"是...总之,"北圣思园Hibernate源代码及课件"是一份全面的学习资源,不仅提供理论知识,还包含实践经验,对于想深入了解和精通Hibernate的开发者来说,是一份不可多得的宝藏。

    java从零基础到精通的整个详细笔记.pdf

    JDBC(Java Database Connectivity)是一种Java API,可以用来在Java应用中访问数据库,Hibernate是一个对象关系映射框架,它提供了从Java类到数据库表之间的映射,以及对数据库操作的封装。 Linux/Unix笔记部分,...

    精通structs笔记

    它通过配置文件(struts-config.xml)来管理应用程序的行为,包括映射URL到Action、定义业务逻辑组件和视图组件之间的关系等。 二、MVC模式在Struts中的应用 1. Model:模型层通常由JavaBean或EJB组成,负责业务...

    Struts2_学习笔记.zip

    这个"Struts2_学习笔记"包含了关于Struts2框架的深入学习资料,是理解并掌握Struts2核心概念和技术的关键。 Struts2的核心设计理念是模型-视图-控制器(MVC)架构模式,它简化了Java Web开发,将业务逻辑、数据展示...

    Java从入门到精通整理笔记

    - Hibernate简介:是一个开源的对象关系映射框架。 - Hibernate核心API介绍。 - Hibernate配置文件、实体映射文件、事务管理等。 - **PL/SQL**: - PL/SQL(Procedural Language for SQL)是Oracle数据库中的...

    HQL学习大全.rar

    1. **Hibernateday1.doc** 和 **Hibernateday2.doc**:可能是连续两天的Hibernate学习笔记,可能涵盖了Hibernate的基础知识,包括安装配置、对象关系映射的基本概念等,也有可能涉及HQL的初步介绍。 2. **HQL基础...

    java从零基础到精通的整个详细笔记(2012版)

    【Java基础】 Java是一种广泛使用的面向对象的编程语言,具有平台...以上是《Java从零基础到精通的整个详细笔记》的主要内容,涵盖了从基础语法到高级框架的广泛知识,适合初学者逐步深入学习Java编程及其相关技术。

    Java从零基础到精通

    【Java从零基础到精通】的学习笔记覆盖了广泛的主题,旨在帮助初学者全面掌握Java编程语言,以及与其相关的技术领域。以下是对各个知识点的详细解释: 1. **Unix**:Unix是一种多用户、多任务的操作系统,是开发和...

    51CTO下载-韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)

    - **Hibernate**:一个 ORM (对象关系映射) 框架,用于简化数据库访问。 - **Spring**:一个轻量级的 IoC 容器和 AOP 框架,用于解决企业级应用的复杂性。 - **Ajax**:一种异步通信技术,用于改善用户体验。 ### ...

    Mybatis笔记1

    另一方面,虽然Hibernate的学习曲线相对平缓,但要达到精通的程度,需要投入较大的学习成本。此外,对于复杂的动态SQL支持,Hibernate并不十分理想,可能仍需在代码中进行大量拼接和判断。 JdbcTemplate是Spring...

Global site tag (gtag.js) - Google Analytics