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();
}
}通过这个例子,我们对相互关联的对象持久化也有了一个大致的了解。
浙公网安备 33010602011771号