典型实例:每个人有不同的名字,或者多个人可以是同一个名字,对于这种现象可以是“一个一”或者“多对一”,这样会被设计成两张表来映射,而我们采用组件关系来映射就可以在一张表中映射实现。 具体过程如下:
>> 步骤一、编写实体文件Name.java 和People.java
Name.java 内容如下: 省略getXXX 和setXXX()
package com.asm.hibernate.domain;
public class Name {
private String firstName ;
private String secondName ;
}
Name.java 内容如下: 省略getXXX 和setXXX()
package com.asm.hibernate.domain;
public class People {
private int id ;
private Name name ;
}
>> 步骤二、编写配置文件People.hbm.xml 内容如下:
< hibernate-mapping
package = "com.asm.hibernate.domain" >
< class name = "People" >
< id name = "id" >
< generator class = "native" />
</ id >
< component name = "name" >
< property name = "firstName" column = "first_name" ></ property >
< property name = "secondName" column = "second_name" ></ property >
</ component >
</ class >
</ hibernate-mapping >
说明:尽管在上一步,说Name 为实体配置文件,但这里并不为为它写配置文件,它实质相当于一个更一般化的属性,且这个属性是在People 的实体配置文件中用〈component 〉元素来进行配置的,它的name 属性是随意随的有意义的名字,而其子元素分别为Name 类的属性值。
>> 步骤三、在主配置文件中关联此实体配置文件:
< mapping resource = "com/asm/hibernate/domain/People.hbm.xml" />
>> 步骤四,编写测试类,内容如下:省略导入的包
package com.asm.hibernate.test;
public class ComponentTest {
public static void main(String[] args) {
Name n = new Name();
n.setFirstName( "zhang" );
n.setSecondName( "san" );
People p = new People();
p.setName(n);
add (p);
}
static void add(People p) {
Session s = null ;
Transaction ts = null ;
try {
s = HibernateUtil.getSession ();
ts = s.beginTransaction();
s.save(p);
ts.commit();
} catch (HibernateException e) {
if (ts != null )
ts.rollback();
throw e;
} finally {
if (s != null )
s.close();
}
}
}
// 说明:这种映射较简单,执行后可以查看下表结构。
6 .总结关联关系:
在理解Hibernate 如何处理这些对象之间的关联关系的底层细节时,考虑如何实现把这种关系保存到数据库,考虑如可检索出关联对象。