1.创建一个人的简单实体类Person
人有姓名,有年龄,有ID,并且人会做事(关联Event),
package org.grgbanking.pojo;
import java.util.HashSet;
import java.util.Set;
/**
*
* @author cjyun
* @Date 2016年11月22日
*/
public class Person {
private String id;
private int age;
private String firstname;
private String lastname;
private Set events = new HashSet();
public Set getEvents() {
return events;
}
public void setEvents(Set events) {
this.events = events;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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 Person(String id, int age, String firstname, String lastname) {
super();
this.id = id;
this.age = age;
this.firstname = firstname;
this.lastname = lastname;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Person [id=" + id + ", firstname=" + firstname + ", lastname=" + lastname + ", events="
+ events.toString() + "]";
}
}
在代码中就可以看出,人与事件并不是直接关联的,而是采用一个中间表进行联系,只需要在数据库中建立一张表Person_Event,字段有person_id和Event_id ,就可以把人和事通过对应的ID关联起来,因为关联表不是一个实际的表,因此不需要创建一个实体类。
2.hibernate的person表映射
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping package="org.grgbanking.pojo">
<class name = "Person" table = "PERSON">
<id name = "id" column = "PERSON_ID"/>
<property name = "age" column = "AGE"></property>
<property name = "firstname" column = "FIRSTNAME"/>
<property name = "lastname" column = "LASTNAME"/>
<set name="events" table="PERSON_EVENT">
<key column="PERSON_ID"/>
<many-to-many column="EVENT_ID" class="Event"/>
</set>
</class>
</hibernate-mapping>
最后别忘了在hibernate的配置文件中添加person的映射
<mapping resource="org/grgbanking/mapping/PersonMapping.xml" />
3.测试
hibernate的具体配置跟上一篇的大致一样,只是多加了person的映射,因此可以参考初学Hibernate,简单实现单表的增删查改
建立一个简单main方法EventManager
/**
*
* @author cjyun
* @Date 2016年11月22日
*/
public class EventManager {
public static void main(String[] args) {
addPersonToEvent("123","888438d0-3494-407c-8892-23801cbe296f");
}
private static void addPersonToEvent(String personId, String 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();
System.out.println("-------------------1-----------"+person.toString());
Event anEvent = (Event) session.load(Event.class,eventId);
session.getTransaction().commit();
person.getEvents().add(anEvent);
Session session2 = HibernateUtil.getSessionfactory().getCurrentSession();
session2.beginTransaction();
person.setFirstname("刘");
session2.update(person); // Reattachment of aPerson
session2.getTransaction().commit();
}
}
“`
4.别忘了加入日志系统,可以更好进行观察。
5.总结
hibernate的多表查询,关键一点是要在表与实体类的映射文件中配置相关信息,比如<set name="events" table="PERSON_EVENT">
<key column="PERSON_ID"/>
<many-to-many column="EVENT_ID" class="Event"/>
</set>