Hibernate多对多操作
多对多映射配置
第一步 创建实体类,用户和联系人
package cn.itcast.manytomany;
import java.util.HashSet;
import java.util.Set;
public class Role {
private Integer role_id;
private String role_name;
private String role_memo;
//一个角色有多个用户
private Set<User> setUser=new HashSet<User>();
public Set<User> getSetUser() {
return setUser;
}
public void setSetUser(Set<User> setUser) {
this.setUser = setUser;
}
public Integer getRole_id() {
return role_id;
}
public void setRole_id(Integer role_id) {
this.role_id = role_id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
public String getRole_memo() {
return role_memo;
}
public void setRole_memo(String role_memo) {
this.role_memo = role_memo;
}
}
package cn.itcast.manytomany;
import java.util.HashSet;
import java.util.Set;
public class User {
private int user_id;
private String user_name;
private String user_password;
//一个用户可以有多个角色
private Set<Role> setRole=new HashSet<Role>();
public Set<Role> getSetRole() {
return setRole;
}
public void setSetRole(Set<Role> setRole) {
this.setRole = setRole;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
}
第二步 让两个实体类之间互相表示
(1)用户里面表示所有角色,使用set集合
//一个用户可以有多个角色
private Set<Role> setRole=new HashSet<Role>();
public Set<Role> getSetRole() {
return setRole;
}
public void setSetRole(Set<Role> setRole) {
this.setRole = setRole;
}
(2)一个角色中有多个用户,使用set集合
//一个角色有多个用户
private Set<User> setUser=new HashSet<User>();
public Set<User> getSetUser() {
return setUser;
}
public void setSetUser(Set<User> setUser) {
this.setUser = setUser;
}
第三步 配置映射关系
(1)基本配置
role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 1配置类和表对应
name属性:实体类全路径
table属性:表示数据库表的名称
-->
<class name="cn.itcast.manytomany.Role" table="t_role">
<!-- 2配置实体类id和表id对应
hibernate要求实体类有一个属性是唯一的值
hibernate要求表有一个字段作为唯一字段
-->
<!-- id标签
name属性:实体类id属性名称 uid
column属性:生成表字段名称(可以自己任意起名)
-->
<id name="role_id" column="role_id">
<!-- 设置数据库表id增长的策略
native:生成表id值主键就是自动增长
-->
<generator class="native"></generator>
</id>
<!-- 配置其他属性和表的字段对应
name属性:实体类属性名称
column属性:表中字段名称 (可以自己任意起名)
-->
<property name="role_name" column="role_name"></property>
<property name="role_memo" column="role_memo"></property>
</class>
</hibernate-mapping>
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 1配置类和表对应
name属性:实体类全路径
table属性:表示数据库表的名称
-->
<class name="cn.itcast.manytomany.User" table="t_user">
<!-- 2配置实体类id和表id对应
hibernate要求实体类有一个属性是唯一的值
hibernate要求表有一个字段作为唯一字段
-->
<!-- id标签
name属性:实体类id属性名称 uid
column属性:生成表字段名称(可以自己任意起名)
-->
<id name="user_aid" column="user_id">
<!-- 设置数据库表id增长的策略
native:生成表id值主键就是自动增长
-->
<generator class="native"></generator>
</id>
<!-- 配置其他属性和表的字段对应
name属性:实体类属性名称
column属性:表中字段名称 (可以自己任意起名)
-->
<property name="user_name" column="user_name"></property>
<property name="user_password" column="user_password"></property>
</class>
</hibernate-mapping>
(2)配置多对多关系
在用户里面表示所有角色,使用set标签
<!-- 在用户里面表示所有角色,使用set标签
name属性,角色set集合名称
table属性值:第三张表的名称
-->
<set name="setRole" table="user_role">
<!-- key标签里面配置
配置当前映射文件在第三张表外键名称 -->
<key column="userid"></key>
<!-- class:角色实体类全路径
column:角色在第三张表外键名称
-->
<many-to-many class="cn.itcast.manytomany.Role" column="roleid"></many-to-many>
</set>
在角色里面表示所有用户,使用set标签
<!-- 在角色里面表示所有用户,使用set标签
-->
<set name="setUser" table="user_role">
<!-- 角色在第三张表外键 -->
<key column="roleid"></key>
<many-to-many class="cn.itcast.manytomany.User" column="userid"></many-to-many>
</set>
第四步 再核心配置文件中引入映射文件
测试
多对多级联保存
根据用户保存角色
第一步 在用户配置文件中set标签进行配置,cascade值save-update
<set name="setRole" table="user_role" cascade="save-update">
第二步 写代码实现
(1)创建用户换个角色对象,把角色放到用户里面,最终保存用户就可以了。
多对多级联删除
第一步 在set标签进行配置,在cascade值delete
<set name="setRole" table="user_role" cascade="save-update,delete">
第二步 删除用户
//演示多对多级联删除
@Test
public void testDelete() {
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
sessionFactory=HibernateUtils.getSessionFactory();
session=sessionFactory.openSession();
tx=session.beginTransaction();
User user=session.get(User.class, 1);
session.delete(user);
tx.commit();
}
catch(Exception e){
tx.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
维护第三张表关系
1 用户和角色是多对多关系,维护关系通过第三张表维护
2 让某个用户有某个角色
第一步 根据id查询用户和角色
第二步 把角色放到用户里面
(1)把角色对象放到用户set集合
//演示维护第三张表
@Test
public void testTable() {
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
sessionFactory=HibernateUtils.getSessionFactory();
session=sessionFactory.openSession();
tx=session.beginTransaction();
//让某个用户有某个角色
//让lucy有经纪人角色
//1查询lucy和经纪人
User lucy=session.get(User.class, 1);
Role role =session.get(Role.class, 3);
//2把角色放到用户的set集合里面
lucy.getSetRole().add(role);
tx.commit();
}
catch(Exception e){
tx.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
3 让某个用户没有某个角色
第一步 根据id查询用户和角色
第二步 从用户里面把角色去掉
(1)从set集合里面把角色移除
@Test
public void testTableDel() {
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
sessionFactory=HibernateUtils.getSessionFactory();
session=sessionFactory.openSession();
tx=session.beginTransaction();
//让某个用户没有某个角色
User user=session.get(User.class, 2);
Role role=session.get(Role.class, 3);
Role role1=session.get(Role.class, 1);
user.getSetRole().remove(role);
user.getSetRole().remove(role1);
tx.commit();
}
catch(Exception e){
tx.rollback();
}finally {
session.close();
sessionFactory.close();
}
}