Hibernate关联映射之多对多

对于多对多的映射关系也是我们在做项目的时候常见的一种情况本篇博客就来介绍一下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>


Project.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.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()方法



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值