对于多对多的映射关系也是我们在做项目的时候常见的一种情况本篇博客就来介绍一下hibernate的多对多的关联映射。
首先我们在这里的例子是项目与雇员之间的关系,即一个项目可以包含多个员工,一个员工也可以做多个项目,他们之间的关系是项目n---n员工。
1.在数据库中建立所需要的表及序列
--项目
drop table projects;
create table projects(
pid int primary key,
pname varchar2(100)
)
drop sequence seq_projects_pId;
create sequence seq_projects_pId
START WITH 1000
INCREMENT BY 1
--员工
drop table employee;
create table employee(
eid int primary key,
ename varchar2(100)
)
drop sequence seq_employee_eId;
create sequence seq_employee_eId
START WITH 1000
INCREMENT BY 1
--中间表
drop table proemp;
create table proemp(
pid int constraint FK_proemp_pid references projects(pid),
eid int constraint FK_employee_eid references employee(eid)
)
2.编写实体类
package com.yc.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Employee implements Serializable{
private static final long serialVersionUID = -3338524489306397897L;
private int eid;
private String ename;
private Set<Project> projects=new HashSet<Project>();
//在这里省略get,set方法以及相关的构造函数
}
package com.yc.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Project implements Serializable{
private static final long serialVersionUID = 7815351737579867144L;
private int pid;
private String pname;
private Set<Employee> employees=new HashSet<Employee>();
//在这里省略get,set方法以及相关的构造函数
}
3.创建hbm文件
Employee.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 9:38:00 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.yc.entity.Employee" table="EMPLOYEE">
<id name="eid" type="int">
<column name="EID" />
<generator class="sequence" >
<param name="sequence">seq_employee_eId</param>
</generator>
</id>
<property name="ename" type="java.lang.String">
<column name="ENAME" />
</property>
<!-- 配置多对多的关联关系,反转关联关系的维护由对方进行 -->
<set name="projects" table="PROEMP" inverse="true" lazy="true">
<key column="EID" />
<many-to-many class="com.yc.entity.Project" column="PID" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 9:38:00 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.yc.entity.Project" table="PROJECTS">
<id name="pid" type="int">
<column name="PID" />
<generator class="sequence" >
<param name="sequence">seq_projects_pId</param>
</generator>
</id>
<property name="pname" type="java.lang.String">
<column name="PNAME" />
</property>
<!-- 配置多对多的关联关系 -->
<set name="employees" table="PROEMP" cascade="all" lazy="true">
<key column="PID"/>
<many-to-many class="com.yc.entity.Employee" column="EID" />
</set>
</class>
</hibernate-mapping>
4.在cfg文件中加入映射路径
<!-- 映射路径 -->
<mapping resource="com/yc/entity/Employee.hbm.xml"/>
<mapping resource="com/yc/entity/Project.hbm.xml"/>
5.编写测试类测试
package com.yc.test;
import java.util.Collections;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.yc.entity.Employee;
import com.yc.entity.Project;
import com.yc.utils.HibernateUtil;
public class MyTest {
@Test
public void testSave(){
Project p1=new Project("项目一");
Project p2=new Project("项目二");
Employee e1=new Employee("张三");
Employee e2=new Employee("李四");
//项目一有 张三和李四参加
Collections.addAll(p1.getEmployees(), e1,e2);
//项目二有 张三参加
p2.getEmployees().add(e1);
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
session.save(p1);
session.save(p2);
tx.commit();
HibernateUtil.closeSession(session);
}
}
运行testSave()方法