zoukankan      html  css  js  c++  java
  • 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")

  • 相关阅读:
    【洛谷 P4166】 [SCOI2007]最大土地面积(凸包,旋转卡壳)
    专题
    【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)
    【洛谷 P3628】 [APIO2010]特别行动队 (斜率优化)
    $POJ1995$ $Raising$ $Modulo$ $Numbers$
    快速运算模板(未完待续)
    $Luogu$ $P1879$ $[USACO06NOV]$ 玉米田 $Corn Fields$
    [转载] $AT2444$ 题解
    [转载] $CF117B$ 题解
    [转载] $CF543B$ 题解
  • 原文地址:https://www.cnblogs.com/ms-grf/p/7239729.html
Copyright © 2011-2022 走看看