读书人

经验9-hibernate 高级映射之组件映射

发布时间: 2012-12-30 10:43:15 作者: rapoo

心得9-hibernate 高级映射之组件映射

1. 组件映射概述

组件类是值类型的,它没有对象标识符属性,在数据库中没有对应的表,它只隶属于另一个持久化类的实例。

把组件类作为持久化类的单个属性来使用

把组件类作为持久化类的集合属性来使用

2.组件映射(User-Name)

关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要永久保存的。

<component name=”name” class=”com.test.hibernate.domain.Name”>

<property name=”initial”/>

<property name=”first”/>

<property name=”last”/>

</component>

当组件的属性不能和表中的字段简单对应的时候可以选择实现:

3.案例分析

把组件类作为持久化类的单个属性来使用

Customers.hbm.xml

<?xmlversion="1.0"?>

<!DOCTYPEhibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mappingpackage="com.hbsi.component">

<class name="Customers"table="customers">

<id name="id">

<generatorclass="native"/>

</id>

<propertyname="name"column="name"/>

<componentname="homeAddress"class="Address">

<propertyname="province"column="home_pro"/>

<propertyname="city"column="home_city"/>

<propertyname="zipcode"column="home_zip"/>

<propertyname="telephone"column="home_tele"/>

</component>

<componentname="deliverAddress"class="Address">

<propertyname="province"column="deliver_pro"/>

<propertyname="city"column="deliver_city"/>

<propertyname="zipcode"column="deliver_zip"/>

<propertyname="telephone"column="deliver_tele"/>

</component>

</class>

</hibernate-mapping>

测试类:TestCustomers.Java

package com.hbsi.component;

import org.hibernate.Session;

import org.junit.Test;

import com.hbsi.utils.HibernateSessionFactory;

public class TestCustomers {

@Test

public void add(){

Customers c = new Customers();

c.setName("张三");

Address homeAddress = new Address();

homeAddress.setProvince("河北省");

homeAddress.setCity("保定市");

homeAddress.setZipcode("071000");

homeAddress.setTelephone("1235345");

c.setHomeAddress(homeAddress);

Address deliverAddress = new Address();

deliverAddress.setProvince("四川省");

deliverAddress.setCity("成都市");

deliverAddress.setZipcode("032700");

deliverAddress.setTelephone("1454655645");

c.setDeliverAddress(deliverAddress);

Session session = HibernateSessionFactory.getSession();

session.beginTransaction();

session.save(c);

session.getTransaction().commit();

HibernateSessionFactory.closeSession();

}

}

把组件类作为持久化类的集合属性来使用

Album.hbm.xml

<?xmlversion="1.0"?>

<!DOCTYPEhibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mappingpackage="com.hbsi.component">

<class name="Album"table="ablum">

<id name="id">

<generatorclass="native"/>

</id>

<propertyname="title"column="title"/>

<bag name="photos"table="photos">

<keycolumn="ablum_id"/>

<composite-elementclass="Photos">

<propertyname="name"/>

<propertyname="filePath"column="file_path"/>

<propertyname="describtion"/>

</composite-element>

</bag>

</class>

</hibernate-mapping>

测试类:AblumTest.Java

package com.hbsi.component;

import java.util.ArrayList;

import java.util.List;

import org.hibernate.Session;

import org.junit.Test;

import com.hbsi.utils.HibernateSessionFactory;

public class TestAlbum {

@Test

public void add(){

Album album = new Album();

album.setTitle("大学时光");

List<Photos> photos = new ArrayList<Photos>();

Photos p1 = new Photos();

p1.setName("p1");

p1.setFilePath("d:\\picture");

p1.setDescribtion("那一年");

Photos p2 = new Photos();

p2.setName("p2");

p2.setFilePath("d:\\picture");

p2.setDescribtion("这些年");

photos.add(p1);

photos.add(p2);

album.setPhotos(photos);

Session session = HibernateSessionFactory.getSession();

session.beginTransaction();

session.save(album);

session.getTransaction().commit();

HibernateSessionFactory.closeSession();

}

}

读书人网 >编程

热点推荐