首页 > Web开发 > 详细

Hibernate关系映射(三) 多对多

时间:2019-07-22 16:47:27      阅读:94      评论:0      收藏:0      [点我收藏+]

一、使用用户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就会自动生成多对多的权限,多对多必须使用第三张表来实现权限效果。不能为在第三张表添加映射文件。

Hibernate关系映射(三) 多对多

原文:https://www.cnblogs.com/Jeely/p/11226198.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!