Hibernate中表与表之间关系的处理(多对多)

一.多对多映射配置图解

Hibernate中表与表之间关系的处理(多对多)_第1张图片

二.Hibernate多对多配置

  • 以用户和角色为例演示
  • 第一步 创建实体类,用户和角色
  • 第二步 让两个实体类之间互相表示
    • (1).一个用户里面表示所有角色,使用set集合
    • (2).一个角色有多个用户,使用set集合
public class Role {

               private Integer role_id;
               private String role_name;
               private String role_memo;

               //一个角色可以由多个用户扮演
               private Set setuser=new HashSet();



            public Set getSetuser() {
                return setuser;
            }
            public void setSetuser(Set 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;
            }
            @Override
            public String toString() {
                return "Role [role_id=" + role_id + ", role_name=" + role_name + ", role_memo=" + role_memo + "]";
            }


}
public class User {

               private Integer user_id;

               private String user_name;

               private String user_password;

               //一个用户可以扮演多个角色
               private Set setrole=new HashSet();



            public Set getSetrole() {
                return setrole;
            }

            public void setSetrole(Set setrole) {
                this.setrole = setrole;
            }

            public Integer getUser_id() {
                return user_id;
            }

            public void setUser_id(Integer 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;
            }

            @Override
            public String toString() {
                return "User [user_id=" + user_id + ", user_name=" + user_name + ", user_password=" + user_password
                        + "]";
            }


}
  • 第三步 配置映射关系
    • (1).基本配置
    • (2).配置多对多关系
    • 在用户里面表示所有角色,使用set标签
    • 在角色里面表示所有用户,使用set标签

Role.hbm.xml



<hibernate-mapping>

                    <class name="cn.st.web.entity.Role" table="t_role">
                          <id name="role_id" column="role_id">
                                 <generator class="native">generator>
                          id>
                    <property name="role_name" column="role_name">property>
                    <property name="role_memo" column="role_memo">property>

                    <set name="setuser" table="user_role">
                            <key column="roleid">key>

                            <many-to-many class="cn.st.web.entity.User" column="userid">many-to-many>
                    set>
                    class>

hibernate-mapping>

User.hbm.xml



<hibernate-mapping>

                 <class name="cn.st.web.entity.User" table="t_user">
                         <id name="user_id" column="user_id">
                             <generator class="native">generator>
                         id>
                          <property name="user_name" column="user_name">property>
                           <property name="user_password" column="user_password">property>
                           
                       <set name="setrole" table="user_role">
                              
                              <key column="userid">key>
                              
                              <many-to-many class="cn.st.web.entity.Role" column="roleid">many-to-many>
                       set>
                 class>

hibernate-mapping>

Hibernate中表与表之间关系的处理(多对多)_第2张图片

  • 第四步 在核心配置文件中引入映射文件
<mapping resource="cn/st/web/entity/Role.hbm.xml"/>
<mapping resource="cn/st/web/entity/User.hbm.xml"/>

测试
运行测试看结果

Hibernate中表与表之间关系的处理(多对多)_第3张图片

三.多对多级联操作

1.多对多级联保存

  • 根据用户保存角色
  • 第一步 在用户配置文件中set标签进行配置,cascade值save-update
    这里写图片描述
  • 第二步 写代码实现
    • 创建用户和角色对象,把角色放到用户里面,最终保存用户就可以了
public void testAdd() {

           Session session=null;

           Transaction tx=null;     

           try {

               session=hibernateUtils.getSessionobject();

               tx=session.beginTransaction();

             //添加两个用户,为每个用户添加两个角色
                //1.创建对象
                User user1=new User();
                user1.setUser_name("lucy");
                user1.setUser_password("123");

                User user2=new User();
                user2.setUser_name("tom");
                user2.setUser_password("456");

                Role r1=new Role();
                r1.setRole_name("总经理");
                r1.setRole_memo("总经理");

                Role r2=new Role();
                r2.setRole_name("秘书");
                r2.setRole_memo("秘书");

                Role r3=new Role();
                r3.setRole_name("保安");
                r3.setRole_memo("保安");

                //2.建立关系,把角色放到用户里面
                //user1 -- r1/r2
                user1.getSetrole().add(r1);
                user1.getSetrole().add(r2);

                //user2 -- r2/r3
                user2.getSetrole().add(r2);
                user2.getSetrole().add(r3);
                //3.保存用户
                session.save(user1);
                session.save(user2);

               tx.commit();//3.提交事务

           }catch(Exception e){
                 e.printStackTrace();
                 tx.rollback();//回滚事务
           }finally {
               if(session!=null)
               session.close();

        }
      }

Hibernate中表与表之间关系的处理(多对多)_第4张图片
Hibernate中表与表之间关系的处理(多对多)_第5张图片

2.多对多级联删除

  • 很少会用到 一般都是维护第三张表关系
  • 第一步 在set标签进行配置,cascade值delete
    这里写图片描述
  • 第二步 根据id删除用户
public void testUpdate() {

           Session session=null;

           Transaction tx=null;     

           try {

               session=hibernateUtils.getSessionobject();

               tx=session.beginTransaction();
               //根据id返回对象
               User user=session.get(User.class,1);
               //根据id删除数据
               session.delete(user);

               tx.commit();//提交事务

           }catch(Exception e){
                 e.printStackTrace();
                 tx.rollback();//回滚事务
           }finally {
               if(session!=null)
               session.close();

        }
      }

Hibernate中表与表之间关系的处理(多对多)_第6张图片

Hibernate中表与表之间关系的处理(多对多)_第7张图片

3.维护第三张表关系

  • 用户和角色多对多关系,维护关系通过第三张表维护
  • 让某个用户有某个角色
    • 第一步 根据id查询用户和角色
    • 第二步 把角色放到用户里面
      • (1).把角色对象放到用户set集合
//让某个用户有某个角色
//让lucy有经纪人角色


//1.查询lucy和经纪人
User user=session.get(User.class,1);
Role role=session.get(Role.class,1);

//2.把角色放到用户的set集合里面
user.getSetrole().add(role);
//持久态不用自己写代码保存
  • 让某个用户没有某个角色
    • 第一步 根据id查询用户和角色
    • 第二步 从用户里面把角色去掉
      • (1).从set集合里面把角色移除

//1.查询
User user=session.get(User.class,2);
Role role=session.get(Role.class,3);

//2.移除
user.getSetrole().remove(role);
//持久态不用自己写代码保存

END!!!!!!!!!!!!!

你可能感兴趣的:(hibernate)