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