Hibernate初探之多对多映射

多对多的应用场景

企业项目开发过程中
  • 一个项目可由多个员工参与开发
  • 一个员工可同时参与开发多个项目
多对多关联(many-to-many)
    多对多关联也是常见的一种关联关系,如项目和员工之间就是典型的多对多关系。
    雇员表 >> 雇员信息    项目表  >> 项目信息
    多对多关联一般采用中间表的形式来表现,即新增一张包含关联双方主键的关联表
    多对多关联可以使用<set>元素和<many-to-many>元素进行配置
创建项目和表
    1.创建Java工程hibernate-many2many
    2.创建主配置文件hibernate.cfg.xml
    3.创建init.sql   
create table project
(
    proid int primary key,
    proname varchar(20) not null
);
create table employee
(
    empid int primary key,
    empname varchar(20)
);
create table proemp
(
    rproid int,
    rempid int
);
alter table proemp add constraint fk_rproid
    foreign key (rproid) references project(proid);
alter table proemp add constraint fk_rempid
    foreign key (rempid) references employee(empid);
    4、创建持久类和映射文件
    Project.java  与Employee类似
public class Project {
	private int proid;
	private String proname;
	// 添加一个员工 的集合
	private Set<Employee> employees = new HashSet<Employee>();
        //无参构造
        //有参构造
        //getter and setter}
    5.配置映射文件
Project.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>
	<class name="com.lijy.entity.Project" table="project">
	    <id name="proid" column="proid" type="java.lang.Integer">
	        <generator class="assigned"></generator>
	    </id>
	    <property name="proname" type="java.lang.String">
	        <column name="proname" length="20"></column>
	    </property>
	    <!-- 设置多对多关联关系 -->
	    <set name="employees" table="proemp">
	        <key column="rproid"></key>
	        <many-to-many class="com.lijy.entity.Employee" column="rempid"></many-to-many>
	    </set>
	</class>
</hibernate-mapping>
Employee.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>
	<class name="com.lijy.entity.Employee" table="employee">
	    <id name="empid" column="empid" type="java.lang.Integer">
	        <generator class="assigned"></generator>
	    </id>
	    <property name="empname" type="java.lang.String">
	        <column name="empname" length="20" not-null="true"></column>
	    </property>
	    <!-- 多对多关联关系 -->
	    <set name="projects" table="proemp">
	        <key column="rempid"></key>
	        <many-to-many class="com.lijy.entity.Project" column="rproid"></many-to-many>
	    </set>
	</class>
</hibernate-mapping>
测试
package com.lijy.test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.lijy.entity.Employee;
import com.lijy.entity.Project;
import com.lijy.util.HibernateUtil;

/**
 * 多对多关联联系的配置
 * 同时建立了Project和Employee之间的双向多对多关联关系
 * 关联关系的维护交由Project方来维护处理,并且在保存Project对象时会一并保存Employee对象
 */
public class Test {
    public static void main(String[] args) {
    	Project project1 = new Project(1001, "项目1");
    	Project project2 = new Project(1002, "项目2");
    	Employee employee1 = new Employee(1, "张三");
    	Employee employee2 = new Employee(2, "李四");
    	
    	//参加项目1的员工有张三和李四
    	project1.getEmployees().add(employee1);
    	project1.getEmployees().add(employee2);
    	//参加项目2的员工有张三
    	project2.getEmployees().add(employee1);
    	
    	Session session = HibernateUtil.getSession();
    	Transaction tx = session.beginTransaction();
    	session.save(project1);
    	session.save(project2);
    	tx.commit();
    	HibernateUtil.closeSession();
	}
}
    如果由Project方来维护,在Project.hbm.xml的set中设置级联方式cascade="all",并且在Employee.hbm.xml中的set设置inverse="true"

总结:

    实现多对多关联关系
    在数据库底层通过添加中间表来指定关联关系
        在 双方的实体中添加一个保存对象的集合
        在双方映射文件中使用<set>元素和<many-to-many>元素进行关联关系的配置。

引用:

    慕课网





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值