• JavaWeb学习:Hibernate多对多关系


    一、创建表

    CREATE TABLE sys_user (
      user_id bigint IDENTITY(1,1) NOT NULL PRIMARY Key,
      user_code varchar(32) NULL,
      user_name varchar(64) NULL,
      user_password varchar(32) NULL ,
      user_state char(1) NULL 
    )
    
    CREATE TABLE sys_role (
      role_id bigint IDENTITY(1,1) NOT NULL PRIMARY Key,
      role_name varchar(32) NULL,
      role_memo varchar(128) DEFAULT NULL
    )
    
    CREATE TABLE sys_user_role (
      role_id bigint NOT NULL,
      user_id bigint NOT NULL,
      PRIMARY KEY (role_id,user_id),
      CONSTRAINT FK_user_role_role_id FOREIGN KEY (role_id) REFERENCES sys_role (role_id) ON DELETE NO ACTION ON UPDATE NO ACTION,
      CONSTRAINT FK_user_role_user_id FOREIGN KEY (user_id) REFERENCES sys_user (user_id) ON DELETE NO ACTION ON UPDATE NO ACTION
    )

    二、创建持久化类

    ①、实体类

    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 class Role {
        private Long role_id;
        private String role_name;
        private String role_memo;
        // 一个角色被多个用户选择:
        // 放置的是用户的集合
        private Set<User> users = new HashSet<User>();
    }

    ②、映射文件

      User映射文件

    <?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>
        <class name="com.hibernate.demo.User" table="sys_user">
            <!-- 建立OID与主键的映射 -->
            <id name="user_id" column="user_id">
                <generator class="native"/>
            </id>
            <!-- 建立普通属性与字段映射 -->
            <property name="user_code" column="user_code"/>
            <property name="user_name" column="user_name"/>
            <property name="user_password" column="user_password"/>
            <property name="user_state" column="user_state"/>
            <!-- 建立与角色的多对多的映射关系 -->
            <!-- 
                set标签
                    * name        :对方的集合的属性名称。private Set<Role> roles = new HashSet<Role>();
                    * table        :多对多的关系需要使用中间表,放的是中间表的名称。
             -->
            <set name="roles" table="sys_user_role" cascade="save-update,delete"  >
                <!-- 
                    key标签:
                        * column    :当前的对象对应中间表的外键的名称。
                 -->
                <key column="user_id"/>
                <!-- 
                    many-to-many标签:
                        * class        :对方的类的全路径
                        * column    :对方的对象在中间表中的外键的名称。
                 -->
                <many-to-many class="com.hibernate.demo.Role" column="role_id"/>
            </set>
        </class>
    </hibernate-mapping>

      Role映射文件

    <?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>
        <class name="com.hibernate.demo.Role" table="sys_role">
            <!-- 建立OID与主键的映射 -->
            <id name="role_id" column="role_id">
                <generator class="native"/>
            </id>
            <!-- 建立普通属性与字段的映射 -->
            <property name="role_name" column="role_name"/>
            <property name="role_memo" column="role_memo"/>
            <!-- 与用户的多对多的映射关系 -->
            <!-- 
                set标签
                    * name        :对方的集合的属性名称。
                    * table        :多对多的关系需要使用中间表,放的是中间表的名称。
             -->
            <set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true">
                <!-- 
                    key标签:
                        * column    :当前的对象对应中间表的外键的名称。
                 -->
                <key column="role_id"/>
                <!-- 
                    many-to-many标签:
                        * class        :对方的类的全路径
                        * column    :对方的对象在中间表中的外键的名称。
                 -->
                <many-to-many class="com.hibernate.demo.User" column="user_id"/>
            </set>
        </class>
    </hibernate-mapping>

    ③、核心文件

    <mapping resource="com/hibernate/demo/User.hbm.xml"/>
    <mapping resource="com/hibernate/demo/Role.hbm.xml"/>

    ④、Java测试代码

    @Test
        public void demo5() {
        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("admin");
        Role role2=new Role();
        role2.setRole_name("guests");
        Role role3=new Role();
        role3.setRole_name("Employee");
        
        // 双向关联
        user1.getRoles().add(role1);
        user1.getRoles().add(role3);
        
        user2.getRoles().add(role2);
        
        role1.getUsers().add(user1);
        role2.getUsers().add(user1);
        role3.getUsers().add(user2);
        
        session.save(user1);
        session.save(user2);
        session.save(role1);
        session.save(role2);
        session.save(role3);
        transaction.commit();
        }

    三、多对多的其他操作

    ①、赋值用户角色

    public void demo5() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        User user=session.get(User.class, 1l);
        Role role=session.get(Role.class, 3l);
        
        user.getRoles().add(role);
        transaction.commit();
        }

    ②、改选用户角色

    @Test
        public void demo5() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        User user=session.get(User.class, 2l);
        Role role3=session.get(Role.class, 3l);
        Role role1=session.get(Role.class, 1l);
        user.getRoles().remove(role3);
        user.getRoles().add(role1);
        transaction.commit();
        }

    ③、删除用户角色

      
        @Test
        public void demo5() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        User user=session.get(User.class, 1l);
        Role role2=session.get(Role.class, 2l);
        user.getRoles().remove(role2);
        transaction.commit();
        }
  • 相关阅读:
    李航统计学习方法(第二版)(六):k 近邻算法实现(kd树(kd tree)方法)
    ActiveMQ的安装和启动
    HTML select autofocus 属性
    macpath (File & Directory Access) – Python 中文开发手册
    Java Bitset类
    Linux zip命令
    HTML DOM Keygen 对象
    tanh (Numerics) – C 中文开发手册
    no-shadow (Rules) – Eslint 中文开发手册
    require-await (Rules) – Eslint 中文开发手册
  • 原文地址:https://www.cnblogs.com/WarBlog/p/13954356.html
Copyright © 2020-2023  润新知