您的位置:首页 > 其它

保存对象、关系映射

2015-12-14 00:00 183 查看
首先是Event类,

public class Event {
private int id;

private String title;
private Date date;
private Set participants = new HashSet();

public Event() {}

public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public Set getParticipants() {
return participants;
}

public void setParticipants(Set participants) {
this.participants = participants;
}

}

其对应的hibernate映射文件为:Event.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cjq.hibernate.tutorial.domain">
<class name="Event" table="HI_EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
<set name="participants" table="HI_PERSON_EVENT">
<key column="EVENT_ID"/>
<many-to-many column="PERSON_ID" class="PERSON"/>
</set>
</class>
</hibernate-mapping>

事件与人有多对多的关联。

Person类为:

public class Person {
private int id;
private int age;
private String firstname;
private String lastname;
private Set events = new HashSet();

private Set emailAddresses = new HashSet();
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public Set getEvents() {
return events;
}
public void setEvents(Set events) {
this.events = events;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public Set getEmailAddresses() {
return emailAddresses;
}
public void setEmailAddresses(Set emailAddresses) {
this.emailAddresses = emailAddresses;
}

@SuppressWarnings("unchecked")
public void addToEvnet(Event event){
this.getEvents().add(event);
event.getParticipants().add(this);
}

public void removeFromEvent(Event event){
this.getEvents().remove(event);
event.getParticipants().remove(this);
}

}

其对应的hibernate配置文件Person.hbm.xml为:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cjq.hibernate.tutorial.domain">
<class name="Person" table="HI_PERSON">
<id name="id" column="PERSON_ID">
<generator class="native"/>
</id>
<property name="age"/>
<property name="firstname"/>
<property name="lastname"/>
<set name="events" table="HI_EVENT">
<key column="PERSON_ID"/>
<many-to-many column="EVENT_ID" class="Event"/>
</set>
<set name="emailAddresses" table="HI_PERSON_EMAIL_ADDR">
<key column="PERSON_ID"/>
<element type="string" column="EMAIL_ADDR"/>
</set>
</class>
</hibernate-mapping>


这里,也体现出人与事件多对多的关系,同时,还加入的人的email地址的元素,用集合表示,说明有一个可能有多个email。

下面就要对定义的两个实体进行操作。

首先,创建一个Event实例,并将具体数据存入数据库:

private void createAndStoreEvent(String title, Date theDate){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

Event event = new Event();
event.setDate(theDate);
event.setTitle(title);
session.save(event);

session.getTransaction().commit();

//HibernateUtil.getSessionFactory().close();

}

同样,对Person实例的操作:

private void createPerson(int age,String firstname,String lastname){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

Person person = new Person();
person.setAge(age);
person.setFirstname(firstname);
person.setLastname(lastname);
session.save(person);

session.getTransaction().commit();
}

上面两个方法只是简单的保存数据,并未建立关联。

为事件添加关联:

private void addPersonToEvent(int personId,int eventId){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

Person person = (Person)session.load(Person.class, personId);
Event event = (Event)session.load(Event.class, eventId);
person.getEvents().add(event);

session.getTransaction().commit();

}


为人添加关联,针对于人与email的关系:

private void addEmailToPerson(int personId,String emailAddress){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

Person person = (Person)session.load(Person.class, personId);
person.getEmailAddresses().add(emailAddress);

session.getTransaction().commit();
}

在为事件添加关联,也可以使用两个不同的事务进行操作:

private void addPersonToEvent2(int personId,int eventId){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

Person person = (Person)session.createQuery("select p from Person p left join fetch p.events where p.id=:pid").setParameter("pid", personId).uniqueResult();
Event event = (Event)session.load(Event.class, eventId);
session.getTransaction().commit();
//End of first unit of work;
person.getEvents().add(event);

//begin second unit of work;
Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();
session2.beginTransaction();
session2.update(person);
session2.getTransaction().commit();
System.out.println("finish");

}


补充说明一下:

获取实体列表操作如下:

private List getEventList(String title, Date theDate){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

List list = session.createQuery("from Event").list();

session.getTransaction().commit();

return list;
}

说明:"from Event"中Event为实体的类名,而不数据库的表名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: