本系列博客汇总在这里:Hibernate 汇总


源码工程文件为:hibernate4.3_08

多对多的关联映射

员工和角色是多对多的关系,一个员工可以分配多个角色,一个角色可以分配给多个员工。

类图:
Hibernate(12)_多对多的关联映射_hibernate
表关系:
Hibernate(12)_多对多的关联映射_其他_02

1、创建 model 对象

package com.wyx.hiber.model;

import java.util.Date;
import java.util.Set;

public class Emp
{

	private Integer empNo;

	private String ename;

	private Date birthday;

	private Integer gender;

	private String address;
	/**
	 * 指定多对多的单端的关系
	 */
	private Set<Role> roles;

	public Set<Role> getRoles()
	{
		return roles;
	}

	public void setRoles(Set<Role> roles)
	{
		this.roles = roles;
	}

	public Integer getEmpNo()
	{
		return empNo;
	}

	public void setEmpNo(Integer empNo)
	{
		this.empNo = empNo;
	}

	public String getEname()
	{
		return ename;
	}

	public void setEname(String ename)
	{
		this.ename = ename;
	}

	public Date getBirthday()
	{
		return birthday;
	}

	public void setBirthday(Date birthday)
	{
		this.birthday = birthday;
	}

	public Integer getGender()
	{
		return gender;
	}

	public void setGender(Integer gender)
	{
		this.gender = gender;
	}

	public String getAddress()
	{
		return address;
	}

	public void setAddress(String address)
	{
		this.address = address;
	}

	@Override
	public String toString()
	{
		return "Emp [empNo=" + empNo + ", ename=" + ename + ", birthday="
				+ birthday + ", gender=" + gender + ", address=" + address
				+ "]";
	}

}

2、单端配置多对多

<?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 package="com.wyx.hiber.model">
	<class name="Emp" table="t_emp">
		<id name="empNo" column="emp_no">
			<generator class="native"></generator>
		</id>
		<property name="ename"></property>
		<property name="birthday"></property>
		<property name="gender"></property>
		<property name="address"></property>
		<!-- 
			set:设置多对多的单端集合
			name:在emp中集合属性名称
			table:要产生的中间表的名称
		 -->
		<set name="roles" table="emp_role" cascade="save-update">
			<!-- 
				把emp表的主键给中间表作为外键
				column:当前emp表的主键名称
			 -->
			<key column="emp_no"></key>
			<!-- 
				指定emp对面端的
				class:指定多的一端的类
				column:指定多的一端的要给中间表的字段名称(role表的主键)
			 -->
			<many-to-many class="Role" column="role_id"></many-to-many>
		</set>
	</class>
	
</hibernate-mapping>

3、测试单端多对多

保存

public void testAdd1()
{
	Session session = HibernateUtils.getSession();
	Transaction tx = session.beginTransaction();

	try
	{
		// 创建员工
		Emp emp = new Emp();
		emp.setEname("魏宇轩");
		emp.setGender(1);
		emp.setAddress("北京");
		emp.setBirthday(new Date());

		// 创建角色
		Role role = new Role();
		role.setRoleName("老师");
		role.setRoleDesc("讲课");

		Role role1 = new Role();
		role1.setRoleName("总监");
		role1.setRoleDesc("管理");

		// 指定当前员工和角色的关系
		Set<Role> set = new HashSet<Role>();
		set.add(role);
		set.add(role1);
		emp.setRoles(set);
		// 保存员工
		session.save(emp);
		tx.commit();
	} catch (Exception e)
	{
		e.printStackTrace();
		tx.rollback();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

Hibernate(12)_多对多的关联映射_其他_03
以上输出结果使用了级联。

查询

public void queryTest()
{
	Session session = HibernateUtils.getSession();
	try
	{
		Emp emp = (Emp) session.get(Emp.class, 1);
		System.out.println(emp);
		for (Role role : emp.getRoles())
		{
			System.out.println(role);
		}
	} catch (Exception e)
	{
		e.printStackTrace();
	} finally
	{
		HibernateUtils.closeResource(session);
	}
}

Hibernate(12)_多对多的关联映射_其他_04

4、多对多双向管理映射

Hibernate(12)_多对多的关联映射_hibernate_05

修改模型

package com.wyx.hiber.model;

import java.util.Set;

public class Role
{

	private Integer roleId;

	private String roleName;

	private String roleDesc;
	/**
	 * 指定多对多的关系
	 */
	private Set<Emp> emps;

	public Set<Emp> getEmps()
	{
		return emps;
	}

	public void setEmps(Set<Emp> emps)
	{
		this.emps = emps;
	}

	public Integer getRoleId()
	{
		return roleId;
	}

	public void setRoleId(Integer roleId)
	{
		this.roleId = roleId;
	}

	public String getRoleName()
	{
		return roleName;
	}

	public void setRoleName(String roleName)
	{
		this.roleName = roleName;
	}

	public String getRoleDesc()
	{
		return roleDesc;
	}

	public void setRoleDesc(String roleDesc)
	{
		this.roleDesc = roleDesc;
	}

	@Override
	public String toString()
	{
		return "Role [roleId=" + roleId + ", roleName=" + roleName
				+ ", roleDesc=" + roleDesc + "]";
	}

}

修改配置

<?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 package="com.wyx.hiber.model">
	<class name="Role" table="t_role">
		<id name="roleId" column="role_id">
			<generator class="native"></generator>
		</id>
		<property name="roleName" column="role_name"></property>
		<property name="roleDesc" column="role_desc"></property>
		<set name="emps" table="emp_role" cascade="save-update">
			<key column="role_id"></key>
			<many-to-many class="Emp" column="emp_no"></many-to-many>
		</set>
	</class> 	
</hibernate-mapping>

测试

和单端的代码基本一致,只是从角色端来看。

如有错误,欢迎指正!