本系列博客汇总在这里:Hibernate 汇总
多对多的关联映射
多对多的关联映射源码工程文件为:hibernate4.3_08
员工和角色是多对多的关系,一个员工可以分配多个角色,一个角色可以分配给多个员工。
类图:
表关系:
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);
}
}
以上输出结果使用了级联。
查询
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);
}
}
4、多对多双向管理映射
修改模型
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>
测试
和单端的代码基本一致,只是从角色端来看。
如有错误,欢迎指正!