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 roles=new HashSet();

    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 getRoles() {
        return roles;
    }

    public void setRoles(Set 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 users=new HashSet();

    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 getUsers() {
        return users;
    }

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

用户映射




<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="roles" table="sys_user_role">
            <key column="user_id" >key>
            
            <many-to-many class="Role" column="role_id" >many-to-many>
        set>
    class>
hibernate-mapping>

角色映射




<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>
       to-many class="Role" column="role_id" >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中上配置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>
            to-many class="User" column="user_id">
            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中上配置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>
       to-many class="Role" column="role_id" >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>
       to-many class="User" column="user_id">
            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();
    }

你可能感兴趣的:(hibernate)