zoukankan      html  css  js  c++  java
  • Hibernate关系映射(三) 多对多

    一、使用用户User和Role实现多对多的示例

    User.java,实现对Role的引用

    package com.lxit.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class User {
        public User(){
            
        }    
        
        public User(String userid, String userName, String userPwd) {
            this.userid = userid;
            this.userName = userName;
            this.userPwd = userPwd;
        }
    
        private String userid;
        private String userName;
        private String userPwd;
        private Set<Role> roles = new HashSet<Role>();
        
        public String getUserid() {
            return userid;
        }
        public void setUserid(String userid) {
            this.userid = userid;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getUserPwd() {
            return userPwd;
        }
        public void setUserPwd(String userPwd) {
            this.userPwd = userPwd;
        }
        public Set<Role> getRoles() {
            return roles;
        }
        public void setRoles(Set<Role> roles) {
            this.roles = roles;
        }
        
    }

    User.hbm.xml配置文件,映射一个多对多的集合,并开启级联效果,由User来维护级联效果

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.lxit.entity.User" table="User">
            <id name="userid" type="java.lang.String">
                <generator class="assigned" />
            </id>
            <property generated="never" lazy="false" name="userName"
                type="java.lang.String">
                <column length="20" name="userName" not-null="true" />
            </property>
            <property generated="never" lazy="false" name="userPwd"
                type="java.lang.String">
                <column length="20" name="userPwd" not-null="true" />
            </property>
            <set name="roles" table="user_role" cascade="all">
                <key column="userid" />
                <many-to-many column="roleid" class="com.lxit.entity.Role" />
            </set>
        </class>
    </hibernate-mapping>

    Role.java 角色类,同样也映射Users集合

    package com.lxit.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Role {
        
        public Role() {
        }
        
        
        public Role(String roleName, String roleDesc) {
            this.roleName = roleName;
            this.roleDesc = roleDesc;
        }
    
    
        private int roleId;
        private String roleName;
        private String roleDesc;
        private Set<User> users = new HashSet<User>();
        
        
        public int getRoleId() {
            return roleId;
        }
        public void setRoleId(int roleId) {
            this.roleId = roleId;
        }
        public String getRoleName() {
            return roleName;
        }
        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }
        public String getRoleDesc() {
            return roleDesc;
        }
        public void setRoleDesc(String roleDesc) {
            this.roleDesc = roleDesc;
        }
    
        public Set<User> getUsers() {
            return users;
        }
    
        public void setUsers(Set<User> users) {
            this.users = users;
        }
    }

    User.hbm.xml映射文件,映射User多对多关系,并设置inverse="true"。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.lxit.entity.Role" table="role">
            <id name="roleId" type="java.lang.Integer">
                <generator class="native"></generator>
            </id>
            <property name="roleName" type="java.lang.String">
                <column name="roleName" length="20" not-null="true"></column>
            </property>
            <set name="users" table="user_role" inverse="true">
                <key column="roleid"></key>
                <many-to-many column="userid" class="com.lxit.entity.User" />
            </set>
        </class>
    </hibernate-mapping>

    添加Mapping映射文件

    <mapping resource="com/lxit/entity/Role.hbm.xml" />
    <mapping resource="com/lxit/entity/User.hbm.xml" />

    最后测试类

    public static void main(String[] args) {
            Role sys = new Role("admin", "系統管理员");
            Role teacher = new Role("teacher","教师");
            
            User user1 = new User("admin", "管理员", "123123");
            User user2 = new User("zhangsan", "张三疯", "123123");
            
            user1.getRoles().add(sys);
            user1.getRoles().add(teacher);
            user2.getRoles().add(teacher);
            
            
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            //session.save(sys);
            //session.save(teacher);
            
            session.save(user1);
            session.save(user2);
            tx.commit();
            
    }

    以上,只需要将role添加到user就会自动生成多对多的权限,多对多必须使用第三张表来实现权限效果。不能为在第三张表添加映射文件。

  • 相关阅读:
    阿里P8推荐的SpingBoot学习手册+Git开源项目实践分享,还不收藏
    阿里P8划重点:JVM+Spring+Mybatis+多线程高并发源码你必须会
    一线大厂工程师推荐:Mysql、Springboot、JVM、Spring等面试合集
    GitHub标星120K+的JDK并发编程指南,连续霸榜GitHub终于开源了
    腾讯被指劝退高龄员工,华为百度也在优化,互联网35岁+该怎么办
    天猫面试官硬核推荐:Dubbo+ES+JVM+多线程/高并发+消息队列
    多线程与高并发:金九银十跳槽季面试必须要掌握的硬核涨薪技能
    纯干货,源码6步曲,带你解析完整的ThreadPoolExecutor
    今日总结
    今日头条技术架构分析
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/5454643.html
Copyright © 2011-2022 走看看