hibernate入门(七)关联关系讨论_组件关系映射
典型实例:每个人有不同的名字,或者多个人可以是同一个名字,对于这种现象可以是“一个一”或者“多对一”,这样会被设计成两张表来映射,而我们采用组件关系来映射就可以在一张表中映射实现。具体过程如下:
>>步骤一、编写实体文件Name.java 和People.java
Name.java内容如下: 省略getXXX和setXXX()
packagecom.asm.hibernate.domain;
public class Name {
??? private String firstName;
??? private String secondName;
}
Name.java内容如下: 省略getXXX和setXXX()
packagecom.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>
??? <componentname="name">
?????? <propertyname="firstName" column="first_name"></property>
?????? <propertyname="secondName" column="second_name"></property>
??? </component>
??? </class>
</hibernate-mapping>
说明:尽管在上一步,说Name为实体配置文件,但这里并不为为它写配置文件,它实质相当于一个更一般化的属性,且这个属性是在People的实体配置文件中用〈component〉元素来进行配置的,它的name属性是随意随的有意义的名字,而其子元素分别为Name类的属性值。
>>步骤三、在主配置文件中关联此实体配置文件:
<mapping resource="com/asm/hibernate/domain/People.hbm.xml"/>
>>步骤四,编写测试类,内容如下:省略导入的包
packagecom.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如何处理这些对象之间的关联关系的底层细节时,考虑如何实现把这种关系保存到数据库,考虑如可检索出关联对象。