多对多的关系映射
员工和角色是多对多的关系,一个员工可以分配多个角色,一个角色可以分配给多个员工
类图:
表关系:(需要有一个中间表)
EmpNo ename empNo roleId roleId roleName
1 张三 1 2 1 开发
2 李四 1 1 2 测试
2 1
1.创建model对象
2.单端配置多对多
Emp.hbm.xml
<hibernate-mapping package="com.zy.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">
<!--
把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>
Role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zy.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>
</class>
</hibernate-mapping>
然后创建表
3.测试单端多对多
1.保存
@Test
public void testSava(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try {
//创建员工
Emp emp = new Emp();
emp.setEname("zhang");
emp.setGender(1);
emp.setAddress("aaaa");
emp.setBirthday(new Date());
//创建角色
Role role = new Role();
role.setRoleName("student");
role.setRoleDesc("zhuan");
//保存角色
session.save(role);
Role role1 = new Role();
role.setRoleName("student11");
role.setRoleDesc("zhuan11");
//保存角色
session.save(role1);
//指定当前员工和角色的关系
Set<Role> set = new HashSet<>();
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);
}
}
也可以设置级联,不用保存角色,在emp.hbm.xml中设置级联
2.查询
4.多对多双向管理映射
1.修改模型
相互提供的主键在不同的文件中必须一致。
2.修改配置
<hibernate-mapping package="com.zy.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">
<key column="role_id"></key>
<many-to-many class="Emp" column="emp_no"></many-to-many>
</set>
</class>
</hibernate-mapping>
3.测试:和单端的代码基本一致,只是从角色端来看。