原文链接
在《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配置文件hibernate.cfg.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 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 participators;
public Event() {}
//符合bean规范的get和set方法。
//其中id的set方法被设置为private。
}
A类的多个实例引用着B类的多个实例,同时B类的多个实例也引用着A类的多个实例的关系被称为多对多关系。Persion类和Event类分别对应PERSIONS表和EVENTS表,如果要建立这两个表之间的多对多关系,需要一个辅助关联表的配合-PERSION_EVENT。
在Event.hbm.xml中增加Set
column="event_id"
在Persion.hbm.xml中增加Set
column="persion_id"
业务代码中建立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();
}
}
通过这个例子,我们对相互关联的对象持久化也有了一个大致的了解。
原文链接