對於多對多的映射關係也是我們在做項目的時候常見的一種情況本篇博客就來介紹一下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()方法