hibernate基础(六)--多对多关联映射

hibernate的多对多关联映射

以用户和角色为例
创建用户实体

package cn.imau.entity;


import java.util.HashSet;
import java.util.Set;

public class User {
    private Long user_id;
    private String user_code;
    private String user_name;
    private String user_password;
    private String user_state;
    //用户所属的角色的集合
    private Set<Role> roles=new HashSet<Role>();

    public Long getUser_id() {
        return user_id;
    }

    public void setUser_id(Long user_id) {
        this.user_id = user_id;
    }

    public String getUser_code() {
        return user_code;
    }

    public void setUser_code(String user_code) {
        this.user_code = user_code;
    }

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

    public String getUser_state() {
        return user_state;
    }

    public void setUser_state(String user_state) {
        this.user_state = user_state;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

创建角色实体

package cn.imau.entity;

import java.util.HashSet;
import java.util.Set;

public class Role {
    private Long role_id;
    private String role_name;
    private String role_memo;
    //一个角色包含多个用户
    private Set<User> users=new HashSet<User>();

    public Long getRole_id() {
        return role_id;
    }

    public void setRole_id(Long 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;
    }

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }
}

用户映射

<?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 package="cn.imau.entity">

    <class name="User" table="sys_user">
        <id name="user_id" >
            <generator class="native"></generator>
        </id>
        <property name="user_code" />
        <property name="user_name"/>
        <property name="user_password" />
        <property name="user_state"/>
        <!-- 多对多关系表达 -->
        <!--
         set标签
            name: 关联的另一方的集合属性名
            table: 中间表的名称
            key
              |-column:外键,别人引用"我"的外键列名
             class: 我与哪个类是多对多关系
             column:外键.我引用比人的外键列名
         -->
        <!-- cascade级联操作:
                    save-update: 级联保存更新
                    delete:级联删除
                    all:级联保存更新+级联删除
            结论: cascade简化代码书写.该属性使不使用无所谓. 建议要用只用save-update.
                 如果使用delete操作太过危险.尤其在多对多中.不建议使用.
                     -->
        <set name="roles" table="sys_user_role">
            <key column="user_id" ></key>
            <!--
            many-to-many标签
               class:关联的另一方的类的全路径
               column:关联的另一方的中间表的外键名称
            -->
            <many-to-many class="Role" column="role_id" ></many-to-many>
        </set>
    </class>
</hibernate-mapping>

角色映射

<?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 package="cn.imau.entity">
    <class name="Role" table="sys_role">
        <id name="role_id">
            <generator class="native"/>
        </id>
        <property name="role_name"/>
        <property name="role_memo"/>
        <set name="users" table="sys_user_role">
            <key column="role_id"></key>
            <many-to-many class="User" column="user_id">
            </many-to-many>
        </set>
    </class>

</hibernate-mapping>

在核心配置文件中引入映射文件

 <mapping resource="cn/imau/entity/User.hbm.xml" />
 <mapping resource="cn/imau/entity/Role.hbm.xml" />

编写测试类

package cn.imau.test;

import cn.imau.entity.User;
import cn.imau.entity.Role;
import cn.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

public class test {
    @Test
    //保存用户和角色
    public void demo1(){
        Session session= HibernateUtils.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        User user1=new User();
        user1.setUser_name("zhangsan");

        User user2=new User();
        user2.setUser_name("lisi");

        Role role1=new Role();
        role1.setRole_name("assistant");

        Role role2=new Role();
        role2.setRole_name("HR");

        Role role3=new Role();
        role3.setRole_name("Manager");

        //如果多对多建立了双向关联,一定要有一方放弃外键维护权
        user1.getRoles().add(role1);
        user1.getRoles().add(role3);
        user2.getRoles().add(role2);
        user2.getRoles().add(role3);

        role1.getUsers().add(user1);
        role2.getUsers().add(user1);
        role2.getUsers().add(user2);
        role3.getUsers().add(user2);

        session.save(user1);
        session.save(user2);
        session.save(role1);
        session.save(role2);
        session.save(role3);

        transaction.commit();
    }

}

多对多的相关操作

级联保存或更新

保存用户级联角色

配置映射

<set name="roles" table="sys_user_role" cascade="save-update">
       <key column="user_id" ></key>
       <many-to-many class="Role" column="role_id" ></many-to-many>
</set>

编写测试代码

package cn.imau.test;

import cn.imau.entity.User;
import cn.imau.entity.Role;
import cn.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

public class test {
    @Test
    /*
    * 多对多只保存一边也是不可以的
    * 配置级联:保存用户级联角色,在User.hbm.xml中<set>上配置cascade="save-update"
    * */
    public void demo2(){
        Session session= HibernateUtils.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        User user1=new User();
        user1.setUser_name("zhangsan");

        User user2=new User();
        user2.setUser_name("lisi");

        Role role1=new Role();
        role1.setRole_name("assistant");

        Role role2=new Role();
        role2.setRole_name("HR");

        Role role3=new Role();
        role3.setRole_name("Manager");

        //如果多对多建立了双向关联,一定要有一方放弃外键维护权
        user1.getRoles().add(role1);
        user1.getRoles().add(role3);
        user2.getRoles().add(role2);
        user2.getRoles().add(role3);

        role1.getUsers().add(user1);
        role2.getUsers().add(user1);
        role2.getUsers().add(user2);
        role3.getUsers().add(user2);

        session.save(user1);
        session.save(user2);
       /* session.save(role1);
        session.save(role2);
        session.save(role3);*/

        transaction.commit();
    }

}

保存角色级联用户

配置映射

<set name="users" table="sys_user_role" cascade="save-update">
            <key column="role_id"></key>
            <many-to-many class="User" column="user_id">
            </many-to-many>
</set>

编写测试代码

package cn.imau.test;

import cn.imau.entity.User;
import cn.imau.entity.Role;
import cn.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

public class test {
    @Test
    /*
    * 多对多只保存一边也是不可以的
    * 配置级联:保存角色级联用户,在Role.hbm.xml中<set>上配置cascade="save-update"
    * */
    public void demo3(){
        Session session= HibernateUtils.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        User user1=new User();
        user1.setUser_name("zhangsan");

        User user2=new User();
        user2.setUser_name("lisi");

        Role role1=new Role();
        role1.setRole_name("assistant");

        Role role2=new Role();
        role2.setRole_name("HR");

        Role role3=new Role();
        role3.setRole_name("Manager");

        //如果多对多建立了双向关联,一定要有一方放弃外键维护权
        user1.getRoles().add(role1);
        user1.getRoles().add(role3);
        user2.getRoles().add(role2);
        user2.getRoles().add(role3);

        role1.getUsers().add(user1);
        role2.getUsers().add(user1);
        role2.getUsers().add(user2);
        role3.getUsers().add(user2);

        /*session.save(user1);
        session.save(user2);*/
        session.save(role1);
        session.save(role2);
        session.save(role3);

        transaction.commit();
    }

}

级联删除

删除用户级联角色
映射配置

<set name="roles" table="sys_user_role" cascade="delete,save-update">
       <key column="user_id" ></key>
       <many-to-many class="Role" column="role_id" ></many-to-many>
</set>

编写测试代码

@Test
    //级联删除:删除用户 级联删除角色
    public void demo4(){
        Session session= HibernateUtils.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        User user=session.get(User.class,1L);
        session.delete(user);

        transaction.commit();
    }

删除角色级联删除用户
映射配置

 <set name="users" table="sys_user_role" cascade="delete,save-update">
       <key column="role_id"></key>
       <many-to-many class="User" column="user_id">
            </many-to-many>
</set>

编写测试代码

@Test
    //级联删除:删除角色 级联删除用户
    public void demo5(){
        Session session= HibernateUtils.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        Role role=session.get(Role.class,3L);
        session.delete(role);

        transaction.commit();
    }

多对多的其他操作

删除某个用户的角色

@Test
    //将2号用户中的1号角色去掉
    public void demo6(){
        Session session= HibernateUtils.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        //查询2号用户
        User user =session.get(User.class,2L);
        //查询1号角色
        Role role=session.get(Role.class,1L);
        //操作集合相当于操作中间表
        user.getRoles().remove(role);

        transaction.commit();
    }

将某个用户的角色改选

@Test
    //将2号用户中的1号角色去掉,改为3号角色
    public void demo7(){
        Session session= HibernateUtils.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        //查询2号用户
        User user =session.get(User.class,2L);
        //查询1号角色
        Role role1=session.get(Role.class,1L);
        //查询3号角色
        Role role3=session.get(Role.class,3L);

        user.getRoles().remove(role1);
        user.getRoles().add(role3);

        transaction.commit();
    }

给某个用户添加新角色

@Test
    //给1号用户添加2号角色
    public void demo8(){
        Session session= HibernateUtils.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        //查询1号用户
        User user =session.get(User.class,1L);
        //查询2号角色
        Role role=session.get(Role.class,2L);


        user.getRoles().add(role);

        transaction.commit();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值