Hibernate入门实例——组件(component)

来源:互联网 发布:网络病毒大规模爆发 编辑:程序博客网 时间:2024/04/19 18:34

Component是一个被包含的对象,它作为值类型被持久化,而非一个被引用的实体。“component(组件)”这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。

配置方法:在<class>标签中加入如下标签: 
        <component name="组件类名">
            <property name="属性名1" />
            <property name="属性名2" />
            <property name="属性名3" />
        </component>

举个例子, 你可以对人员(User)如以下这样来建模:

package com.metis.hibernate.domain;public class User {private Long id;private Name name;private int age;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Name getName() {return name;}public void setName(Name name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

 

 

将人员名称作为人员的一个组成部分,用一个单独的类Name来表示:

package com.metis.hibernate.domain;public class Name {private String firstName;private String middleName;private String lastName;public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getMiddleName() {return middleName;}public void setMiddleName(String middleName) {this.middleName = middleName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}}


以下是User的Hibernate映射文件:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2010-8-29 7:35:06 by Hibernate Tools 3.3.0.GA --><hibernate-mapping>    <class name="com.metis.hibernate.domain.User" table="USER">        <id name="id" type="java.lang.Long">            <column name="ID" />            <generator class="native" />        </id>        <component name="name" class="com.metis.hibernate.domain.Name" >            <property name="firstName" column="FIRST_NAME"/>            <property name="middleName" column="MIDDLE_NAME"/>            <property name="lastName" column="LAST_NAME"/>        </component>        <property name="age" type="int">            <column name="AGE" />        </property>    </class></hibernate-mapping>

 

由于Name是User的一个组成部分,两个类共同映射同一个数据库表USER表,USER表中包括ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,AGE五个属性字段。因此Name不需要单独的映射文件。

下面是测试用例:

package com.metis.hibernate.test;import org.hibernate.Session;import com.metis.hibernate.domain.Name;import com.metis.hibernate.domain.User;import com.metis.hibernate.util.HibernateUtil;/** * 组件测试 * 组件是将表中的部分相关字段提取出来,用独立的类来表示。 * 如本例所示,user表中包括ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,AGE五个属性字段。 * */public class TestComponent {public static void main(String[] args) {Session session = HibernateUtil.openSession();session.beginTransaction();Name name = new Name();name.setFirstName("");name.setMiddleName("");name.setLastName("");User user = new User();user.setName(name);user.setAge(12);session.save(user);session.getTransaction().commit();HibernateUtil.closeSession();}}

 

数据库表USER脚本:
CREATE TABLE USER(ID BIGINT PRIMARY KEY AUTO_INCREMENT,FIRST_NAME VARCHAR(255),MIDDLE_NAME VARCHAR(255),LAST_NAME VARCHAR(255),AGE INT);

为方便大家学习,本系列文章提供了相关的学习资料和可直接运行的工程源代码:
源代码下载:点击下载
推荐:Hibernate参考手册3.5.3(中文版).pdf