hibernate 多对多

表中的关系:

实体中的关系:

员工类User.java

package cn.future.domain;

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

public class User {

    /*CREATE TABLE `sys_user` (
      `user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
      `user_code` varchar(32) NOT NULL COMMENT '用户账号',
      `user_name` varchar(64) NOT NULL COMMENT '用户名称',
      `user_password` varchar(32) NOT NULL COMMENT '用户密码',
      `user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',
      PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;*/
    
    private Long user_id;
    private String user_code;
    private String user_name;
    private String user_password;
    private Character 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 Character getUser_state() {
        return user_state;
    }

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

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

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

员工表映射文件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 package="cn.future.domain" >
    <class name="User" table="sys_user" >
        <id name="user_id"  >
            <generator class="native"></generator>
        </id>
        <property name="user_code" column="user_code" ></property>
        <property name="user_name" column="user_name" ></property>
        <property name="user_password" column="user_password" ></property>
        <property name="user_state" column="user_state" ></property>
        
        <!-- 多对多关系 -->
        <!-- 
            name:集合属性名
            table:中间表名
            key:column 外键,别人引用"我"的外键列名
            many-to-many:我与哪个类是多对多的关系 column:外键,我引用别人的外键列名
         -->
        <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>

角色类Role.java

package cn.future.domain;

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

public class Role {

    /*CREATE TABLE `sys_role` (
      `role_id` bigint(32) NOT NULL AUTO_INCREMENT,
      `role_name` varchar(32) NOT NULL COMMENT '角色名称',
      `role_memo` varchar(128) DEFAULT NULL COMMENT '备注',
      PRIMARY KEY (`role_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;*/
    
    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;
    }
    
}

角色映射文件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 package="cn.future.domain" >
    <class name="Role" table="sys_role" >
        <id name="role_id"  >
            <generator class="native"></generator>
        </id>
        <property name="role_name" column="role_name" ></property>
        <property name="role_memo" column="role_memo" ></property>
        
        <!-- inverse属性:配置关系是否维护
               true:customer不维护关系
               false(默认值):customer维护关系
               多对多关系表中必须有一方设置这个属性为true
          -->
        <set name="users" inverse="true" table="sys_user_role">
            <key column="role_id"></key>
            <many-to-many class="User" column="user_id"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

操作:

package cn.future.many2many;


import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.future.domain.Customer;
import cn.future.domain.LinkMan;
import cn.future.domain.Role;
import cn.future.domain.User;
import cn.future.utils.HibernateUtils;

public class Demo {

    @Test
    //多对多一关系操作
    public void fun(){
        //1获得session
        Session session = HibernateUtils.openSession();
        //2开启事务
        Transaction ts = session.beginTransaction();
        //3操作
        //创建两个User
        User ms = new User();
        ms.setUser_name("ms");
        User grf = new User();
        grf.setUser_name("grf");
        //创建三个个Role
        Role home = new Role();
        home.setRole_name("home");
        Role wife = new Role();
        wife.setRole_name("wife");
        Role husband = new Role();
        husband.setRole_name("husband");
        //用户表达关系
        ms.getRoles().add(home);
        ms.getRoles().add(husband);
        grf.getRoles().add(home);
        grf.getRoles().add(wife);
        //角色表达关系  如果某方设置invserse="true"时不用add来维护关系(下面四行代码可以去掉)
        /*home.getUsers().add(ms);
        home.getUsers().add(grf);
        wife.getUsers().add(grf);
        husband.getUsers().add(ms);*/
        //保存
        session.save(ms);
        session.save(grf);
        session.save(home);
        session.save(wife);
        session.save(husband);
        //4提交事务
        ts.commit();
        //5关闭资源
        session.close();
    }
    
    @Test
    //为用户添加角色
    public void fun1(){
        //1获得session
        Session session = HibernateUtils.openSession();
        //2开启事务
        Transaction ts = session.beginTransaction();
        //3操作
        //获得用户
        User ms = session.get(User.class, 1l);
        //创建角色
        Role man = new Role();
        man.setRole_name("man");
        //将角色添加到用户中
        ms.getRoles().add(man);
        //将角色转换为持久化
        session.save(man);
        //4提交事务
        ts.commit();
        //5关闭资源
        session.close();
    }
    
    @Test
    //为用户解除角色
    public void fun2(){
        //1获得session
        Session session = HibernateUtils.openSession();
        //2开启事务
        Transaction ts = session.beginTransaction();
        //3操作
        //获得用户 和 角色
        User ms = session.get(User.class, 1l);
        Role man = session.get(Role.class, 4l);
        //将角色从用户集合中移除
        ms.getRoles().remove(man);
        //4提交事务
        ts.commit();
        //5关闭资源
        session.close();
    }
    
    @Test
    //查看用户所有角色
    public void fun3(){
        //1获得session
        Session session = HibernateUtils.openSession();
        //2开启事务
        Transaction ts = session.beginTransaction();
        //3操作
        //获得用户
        User ms = session.get(User.class, 1l);
        
        Set<Role> roles = ms.getRoles();
        for(Role role : roles){
            System.out.println(role.getRole_name());
        }
        //4提交事务
        ts.commit();
        //5关闭资源
        session.close();
    }
    
    @Test
    //查看角色下所有用户
    public void fun4(){
        //1获得session
        Session session = HibernateUtils.openSession();
        //2开启事务
        Transaction ts = session.beginTransaction();
        //3操作
        //获得用户
        Role home = session.get(Role.class, 1l);
        
        Set<User> users = home.getUsers();
        for(User user : users){
            System.out.println(user.getUser_name());
        }
        //4提交事务
        ts.commit();
        //5关闭资源
        session.close();
    }
    
}

注意:多对多关系,在维护关系式一定要设置某方放弃维护关系(也就是给某方设置inverse="true")

原文地址:https://www.cnblogs.com/ms-grf/p/7239729.html