`

hibernate 映射组成关系( component )

阅读更多

 

  • 普通映射

如果一张表的列太多了,那我们应该怎么做呢?可能有些人的做法就是:将一张一有拆分成两张表,那除了将表进行拆分,我们还能怎么样呢?在 Hibernate对这种表的列太多,进行拆分,有一种非常好的解决方案,那就是基于Component技术,使用Component技术,我们可以将一 种表,按照字段的类型进行分类,同一类的,可以使用一个对象进行封装,而这个封装的对象,就是一个Component。假如,一个用户他的信息可能包含以 下几种分类,住址(包括家庭地址、办公地址、家庭邮编、办公邮编等)、电话(家庭电话、办公电话、手机、小灵通)、邮件地址(办公邮箱、私人邮箱等)、通 信工具(QQ号码、MSN、雅虎帐号、网易泡泡等),对于这些属性类别,我们都可以使用对象进行封装。

     假如现在有以下这样的数据库表:


建表语句:

程序代码 程序代码
drop table if exists T_USER;

/*==============================================================*/
/* Table: T_USER                                                 */
/*==============================================================*/
create table T_USER
(
   ID                   INT not null auto_increment,
   USER_NAME             VARCHAR( 20) not null ,
   LOGINID               VARCHAR( 20) not null ,
   PASSWORD             VARCHAR( 32) not null ,
   AGE                   INT,
   ADDRESS               VARCHAR( 255) ,
   MOBILE_PHONE         VARCHAR( 20) ,
   PHS                   VARCHAR( 20) ,
   PHONE                 VARCHAR( 20) ,
   DEGREE               VARCHAR( 20) ,
   primary key ( ID)
) ;



现在假如除了ID、用户名、密码、登录号之外,所有属性都作为Hibernate的一个详细信息,那我们可以这样设计我们的类:
User.java

程序代码 程序代码
package zizz. model;

import java. io. Serializable;

/**
* 该对象是针对着数据库的T_USER表.
*
*
* Create-Time:Apr 21, 2008 9:53:58 PM
*/

public class User implements Serializable {

    /**
     * serialVersionUID
     */

    private static final long serialVersionUID = 1L;

    private int id;
    
    private String userName;
    
    private String loginId;
    
    private String password;
    
    private UserDetail userDetail;

    public UserDetail getUserDetail( ) {
        return userDetail;
    }

    public void setUserDetail( UserDetail userDetail) {
        this . userDetail = userDetail;
    }

    public int getId( ) {
        return id;
    }

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

    public String getUserName( ) {
        return userName;
    }

    public void setUserName( String userName) {
        this . userName = userName;
    }

    public String getLoginId( ) {
        return loginId;
    }

    public void setLoginId( String loginId) {
        this . loginId = loginId;
    }

    public String getPassword( ) {
        return password;
    }

    public void setPassword( String password) {
        this . password = password;
    }
}



UserDetail.java

程序代码 程序代码
package zizz. model;

import java. io. Serializable;

/**
* 用户详情信息.
*
* <a href="http://www.suneca.com ">ZIZZ</a>
*
* Create-Time:Apr 23, 2008 10:39:47 PM
*/

public class UserDetail implements Serializable{

    /**
     * serialVersionUID
     */

    private static final long serialVersionUID = 1L;

    private int age;
    
    private String address;
    
    private String mobilePhone;
    
    private String phs;
    
    private String phone;
    
    private String degree;

    public int getAge( ) {
        return age;
    }

    public void setAge( int age) {
        this . age = age;
    }

    public String getAddress( ) {
        return address;
    }

    public void setAddress( String address) {
        this . address = address;
    }

    public String getMobilePhone( ) {
        return mobilePhone;
    }

    public void setMobilePhone( String mobilePhone) {
        this . mobilePhone = mobilePhone;
    }

    public String getPhs( ) {
        return phs;
    }

    public void setPhs( String phs) {
        this . phs = phs;
    }

    public String getPhone( ) {
        return phone;
    }

    public void setPhone( String phone) {
        this . phone = phone;
    }

    public String getDegree( ) {
        return degree;
    }

    public void setDegree( String degree) {
        this . degree = degree;
    }
    
}



User的hibernate mapping file
User.hbm.xml

程序代码 程序代码
< ? xml version= "1.0" encoding= "UTF-8" ? >
< !DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd " >
< hibernate-mapping package= "zizz.model" >
    < class name= "User" table= "T_USER" >
        < id name= "id" column= "ID" >
            < generator class= "increment" / >
        < / id>
        < property name= "userName" column= "USER_NAME" / >
        < property name= "loginId" column= "LOGINID" / >
        < property name= "password" column= "PASSWORD" / >
        
        < component name= "userDetail" class= "UserDetail" lazy= "true" >
            < property name= "age" column= "AGE" / >
            < property name= "address" column= "ADDRESS" / >
            < property name= "mobilePhone" column= "MOBILE_PHONE" / >
            < property name= "phs" column= "PHS" / >
            < property name= "phone" column= "PHONE" / >
            < property name= "degree" column= "DEGREE" / >
        < / component>
    < / class>
< / hibernate-mapping>



测试类:

程序代码 程序代码
package zizz. test;

import zizz. dao. UserDAO;
import zizz. dao. hibernate. UserDAOHibernate;
import zizz. model. User;
import zizz. model. UserDetail;

/**
* 测试Hibernate Component.
* <a href="http://www.suneca.com ">ZIZZ</a>
*
* Create-Time:Apr 23, 2008 11:33:30 PM
*/

public class ComponentTest {
    
    public static void main( String[ ] args) {
         ComponentTest test = new ComponentTest( ) ;
         test. testFind( ) ;
    }
    
    /**
     * 测试创建一个新帐号
     */

    public void testCreateUser( ) {
         UserDAO dao  = new UserDAOHibernate( ) ;
        
         User user = new User( ) ;
         user. setLoginId( "cyz" ) ;
         user. setPassword( "admin" ) ;
         user. setUserName( "广州IT培训" ) ;
        
         UserDetail detail = new UserDetail( ) ;
         detail. setAddress( "华南师范大学计算机学院" ) ;
         detail. setAge( 20) ;
         detail. setDegree( "工学硕士" ) ;
         detail. setMobilePhone( "13888888888" ) ;
         detail. setPhone( "020-85210088" ) ;
         detail. setPhs( "020-85210088" ) ;
        
         user. setUserDetail( detail) ;
        
         dao. createUser( user) ;         
    }
    
    /**
     * 测试根据ID查找用户
     */

    public void testFind( ) {
         UserDAO dao  = new UserDAOHibernate( ) ;
         User user = dao. findUserById( 1) ;
         System. out. println( user. getUserDetail( ) ) ;
    }
}

  • 复合组成关系
computer ----------> CP UBox -------------->GraphicsCard
                                              -------------->Vendor

CP UBox,GraphicsCard是组成关系,没有hbm.xml
Verndor 是关联关系 有 Vendor.hbm.xml 对应

Computer.hbm.xml

<hibernate-mapping>
   <class name="mypack.Computer" table="COMPUTERS">
          <id name="id" type="long" colum="ID">
              <generatro  class="increment"/>
          </id>
          <property name="type" type="string">
                <column name="COMPUTER_TYPE" />
          </property>
          
          <component name="cpuBox" class="mypack.CpuBox">
                  <parent name="computer"/>
                  <property name="type" type="string">
                       <column name="CPUBOX_TYPE" />
                  </property>
                   <component name="graphicsCard" class="mypack.GraphicsCard">
                        <parent name="cpuBox"/>
                        <property name="type" type="string">
                              <column name="GRAPHICSCARD_TYPE" />
                         </property>                   
                   </component>
                    
                   <many-to-one name="vendor" column="CPUBOX_VENDOR_ID" class="mypack.Vendor" not-null="true"
          </component>
  </class>
</hibernate-mapping>
 


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Hibernate教程09_关系映射之组件映射

    在" Hibernate教程09_关系映射之组件映射 "的配套源码`s2sh_relation06_component`中,你可能会看到如何实际应用这些概念的例子。源码可能包含了`Employee`、`Address`以及其他相关类,以及对应的配置文件,如`...

    Hibernate 映射文件 结构

    【标题】"Hibernate映射文件结构"涉及到的是Java持久化框架Hibernate的核心概念,它用于将对象与数据库表之间的关系进行定义。映射文件是Hibernate工作的重要组成部分,它们以XML格式编写,通常命名为`.hbm.xml`,并...

    hibernate复杂关系的映射

    为了将这些映射转换为实际的数据库表结构,我们可以使用`SchemaExport`工具,它会根据Hibernate映射文件生成SQL语句来创建和更新数据库。示例中展示了创建`employers`、`employment_periods`和`employees`表的SQL...

    hibernate组件映射

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了Java应用与数据库之间的交互。在Hibernate中,组件映射是将一个类的实例作为另一个类的一个属性进行持久...

    component(组件映射)

    3. **Component的声明**:说明如何在Hibernate的配置文件或注解中声明一个Component,包括它的类定义、属性和关联关系。 4. **Component的嵌入方式**:介绍如何在其他实体类中嵌入Component,包括使用`@Component`...

    Hibernate组件映射代码详解

    * Hibernate映射关系 部分内容的知识点: * 组件关联映射的实现方式 * Hibernate组件映射的配置文件(People.hbm.xml) * 组件类的定义和使用(MyName.java) * 实体类的定义和使用(People.java) * Hibernate的Session...

    《Hibernate 各类映射文件与配置文件模板》HibernateMappingConfig.zip

    《Hibernate各类映射文件与配置文件模板》是一个包含多种Hibernate映射和配置示例的压缩包,用于帮助开发者理解和使用Hibernate框架。Hibernate是Java领域的一个流行的对象关系映射(ORM)框架,它允许开发者用面向...

    Hibernate组件映射(annotation/xml)

    在Java持久化领域,Hibernate是一个不可或缺的框架,它提供了强大的对象关系映射(ORM)能力。本文将深入探讨Hibernate中的组件映射,包括使用注解(Annotation)和XML配置两种方式,以帮助开发者更好地理解和应用这...

    Hibernate配置文件中映射元素详解

    ### Hibernate映射文件基础结构 映射文件通常以`&lt;!DOCTYPE hibernate-mapping&gt;`开头,引用DTD(文档类型定义),确保文件遵循正确的格式。例如: ```xml &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/...

    Hibernate对象关系

    **HIBERNATE映射** 对于一对一的映射,可以使用`&lt;one-to-one&gt;`标签来实现: ```xml &lt;hibernate-mapping&gt; &lt;/hibernate-mapping&gt; ``` 这里`constrained="true"`意味着如果删除`Foo`对象,则关联的`Bar`...

    Hibernate_test

    Hibernate是Java领域中一款广泛应用的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互,使得开发者可以使用面向对象的方式来操作数据库。在"Hibernate_test"这个主题中,我们将深入探讨Hibernate的...

    Hibernate继承映射

    【Hibernate继承映射】是Java开发中...以上就是关于Hibernate继承映射、一对一关系、组件映射以及HQL的基础知识,这些概念和实践技巧在Java企业级开发中非常常见,熟练掌握能有效提高数据操作的效率和代码的可维护性。

    对Hibernate配置文件中的映射元素详解

    在本文中,我们将深入探讨Hibernate配置文件中的映射元素,这些元素是将对象关系映射到数据库的关键部分。首先,我们需要了解映射文件的基本结构,它通常是一个XML文档,遵循特定的DTD(文档类型定义)。 `...

    Hibernate_code

    对于那些刚开始学习Hibernate或者想要深入理解ORM(对象关系映射)机制的人来说,这是一个非常宝贵的资源。 **知识点详解:** 1. **Hibernate框架**:Hibernate是一个开源的Java持久化框架,它提供了一种在Java...

    hibernate源码下载

    `hibernate_component_mapping`文件可能讨论了Hibernate的组件映射。组件是一组相关的属性,它们可以作为一个整体被映射到数据库的一个或多个字段上。组件映射提供了一种有效的方式,将复杂对象分解为更小的部分,...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    Hibernate3.1_学习源码

    03 03Hibernate_Component : 实体细粒度的划分,数据库中的一张表在程序中划分为几个部分的实体,配置文件和增、删、改、查的使用。 04 04Hibernate_Composite : 复合主键的使用,在开发中很少用到,一般良好的设计...

Global site tag (gtag.js) - Google Analytics