hibernate学习笔记-2入门初体验关联映射

原文链接

hibernate学习笔记-1入门初体验对象持久化中我们简单介绍了hibernate的使用背景,并用一个持久化集体活动(Event)的例子来对hibernate开发做一个大体的了解。

现在我们引入一个新的实体类参与者(Persion)来看看如何利用hibernate将相互联系的对象持久化到数据库中。

package org.hibernate.tutorial.domain;
public class Person {
private Long id;
private int age;
private String firstname;
private String lastname;
public Person() {}
//符合bean规范的get和set方法。
//其中id的set方法被设置为private。
}
创建映射文件Persion.hbm.xml

<hibernate-mapping package="org.hibernate.tutorial.domain">
<class name="Person" table="PERSON">
<id name="id" column="PERSON_ID">
<generator class="native"/>
</id>
<property name="age"/>
<property name="firstname"/>
<property name="lastname"/>
</class>
</hibernate-mapping>
hibernate配置文件hibernate.cfg.xml中增加映射文件的声明

<mapping resource="org/hibernate/tutorial/domain/Person.hbm.xml"/>
到现在为止,对于Persion类的配置基本上和之前的Event类相似。

我们来分析一下集体活动(Event)和人(Persion)之间可能建立何种联系。一个Event可能有多个Persion参加,同样的一个Persion可能参加多个Event。

Persion类中增加一个Set,作为存放这个Persion参与的Event的列表,Event类中增加一个Set,作为存放参与这个Event的Peresion列表。

package org.hibernate.tutorial.domain;
public class Person {
private Long id;
private int age;
private String firstname;
private String lastname;
//参加的活动列表
private Set<Event> events;
public Person() {}
//符合bean规范的get和set方法。
//其中id的set方法被设置为private。
}

package mypackage.domain;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
//参与者列表
private Set<Persion> participators;
public Event() {}
//符合bean规范的get和set方法。
//其中id的set方法被设置为private。
}

A类的多个实例引用着B类的多个实例,同时B类的多个实例也引用着A类的多个实例的关系被称为多对多关系。Persion类和Event类分别对应PERSIONS表和EVENTS表,如果要建立这两个表之间的多对多关系,需要一个辅助关联表的配合-PERSION_EVENT。
在Event.hbm.xml中增加Set<Persion>映射配置

<class name="Event" table="EVENTS"> 
<id name="id" column="EVENT_ID">  
<generator class="native"/>  
</id>
<set name="participators" table="PERSION_EVENT">
<key>
column="event_id"
</key>
<many-to-many class="mypack.Persion" column="persion_id"/>
</set>
</class>  

在Persion.hbm.xml中增加Set<Event>映射配置

<class name="Persion" table="PERSIONS"> 
<id name="id" column="PERSION_ID">  
<generator class="native"/>  
</id>
<set name="events" table="PERSION_EVENT">
<key>
column="persion_id"
</key>
<many-to-many class="mypack.Event" column="event_id"/>
</set>
</class> 

业务代码中建立Event和Persion之间的引用关系并对实例进行持久化。

//创建多个Event实例
Event event1=new Event();
event1.setTitle("event1");
Event event2=new Event();
event2.setTitle("event2");
//创建多个Persion实例
Persion persion1=new Persion();
persion1.setFirstName("Tom");
Persion persion2=new Persion();
persion2.setFirstName("Jack");
//建立多对多关系
event1.getParticipators().add(persion1);
persion1.getEvents().add(event1);
event1.getParticipators().add(persion2);
persion2.getEvents().add(event1);
event2.getParticipators().add(persion2);
persion2.getEvents().add(event2);
try{
Transaction tx = session.beginTransaction();
//多对多关系必须同时对关联双方进行保存
session.save(event1);
session.save(event2);
session.save(persion1);
session.save(persion2);
tx.commit();
}
catch(Exception e){
if(tx!=null){
tx.rollback();
}
}

通过这个例子,我们对相互关联的对象持久化也有了一个大致的了解。

原文链接

posted on 2012-01-15 22:26  边晓宇  阅读(166)  评论(0编辑  收藏  举报