5.组件关系映射:
典型实例:每个人有不同的名字,或者多个人可以是同一个名字,对于这种现象可以是“一个一”或者“多对一”,这样会被设计成两张表来映射,而我们采用组件关系来映射就可以在一张表中映射实现。具体过程如下:
>>步骤一、编写实体文件Name.java 和People.java
Name.java内容如下: 省略getXXX和setXXX()
- package com.asm.hibernate.domain;
- public class Name {
- private String firstName;
- private String secondName;
- }
package com.asm.hibernate.domain;
public class Name {
private String firstName;
private String secondName;
}
People.java内容如下: 省略getXXX和setXXX()
- package com.asm.hibernate.domain;
- public class People {
- private int id;
- private Name name;
- }
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>
<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();
- }
- }
- }
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如何处理这些对象之间的关联关系的底层细节时,考虑如何实现把这种关系保存到数据库,考虑如可检索出关联对象。