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(); } }