Hibernate映射关系之多对多(三)

多对多的映射关系,这里我用的是角色跟用户两个实体,一个用户可能有多个角色,一个角色同时有多个用户。
1、数据库对象关系


Hibernate映射关系之多对多(三)_第1张图片
多对多.png

2、实体关系


Hibernate映射关系之多对多(三)_第2张图片
多对多实体关系.png

3、建表
user表:

    CREATE TABLE user(
            user_id BIGINT(32) PRIMARY KEY auto_increment,
            user_name VARCHAR(32) not NULL,
            user_code VARCHAR(32) not NULL,
            user_password VARCHAR(32) not NULL
            )ENGINE=INNODB CHARSET=utf8;

role表:

CREATE TABLE role(
            role_id BIGINT(32) PRIMARY KEY auto_increment,
            role_name VARCHAR(32) not NULL,
            role_memo VARCHAR(128) DEFAULT NULL
            )ENGINE=INNODB CHARSET=utf8;

4、编写实体与实体映射文件:

User.java

package com.nieshenkuan.model;

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

public class User {
//  CREATE TABLE user(
//          user_id BIGINT(32) PRIMARY KEY auto_increment,
//          user_name VARCHAR(32) not NULL,
//          user_code VARCHAR(32) not NULL,
//          user_password VARCHAR(32) not NULL
//          )ENGINE=INNODB CHARSET=utf8;
    private Long user_id;
    private String user_name;
    private String user_code;
    private String user_password;
    private Set roles=new HashSet<>();
    
    
    
    
    public Set getRoles() {
        return roles;
    }
    public void setRoles(Set roles) {
        this.roles = roles;
    }
    public Long getUser_id() {
        return user_id;
    }
    public void setUser_id(Long user_id) {
        this.user_id = user_id;
    }
    public String getUser_name() {
        return user_name;
    }
    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }
    public String getUser_code() {
        return user_code;
    }
    public void setUser_code(String user_code) {
        this.user_code = user_code;
    }
    public String getUser_password() {
        return user_password;
    }
    public void setUser_password(String user_password) {
        this.user_password = user_password;
    }
    
    
    
}

User.hbm.xml





    
        
            
            
        
        
        
        
        
        
        
        
         
         
         
        
            
                
            
            
        
    


Role.java

package com.nieshenkuan.model;

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

public class Role {
//  CREATE TABLE role(
//          role_id BIGINT(32) PRIMARY KEY auto_increment,
//          role_name VARCHAR(32) not NULL,
//          role_memo VARCHAR(128) DEFAULT NULL
//          )ENGINE=INNODB CHARSET=utf8;
    
    private Long role_id;
    private String role_name;
    private String role_memo;
    private Set users=new HashSet<>();
    
    
    
    
    public Set getUsers() {
        return users;
    }
    public void setUsers(Set users) {
        this.users = users;
    }
    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;
    }
    
    
}

Role.hbm.xml





    
        
            
            
        
        
        
        
        
            
            
        
    


5、测试

/**
     * 添加数据
     */
    @Test
    public  void test() {
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();
        // ---------------------------------------------
         User u1=new User();
         u1.setUser_name("小飞");
         u1.setUser_code("ww");
         u1.setUser_password("ww1");
         
         User u2=new User();
         u2.setUser_name("大飞");
         u2.setUser_code("ee");
         u2.setUser_password("ee2");
         
         Role role1=new Role();
         role1.setRole_name("设计师");
         
         Role role2=new Role();
         role2.setRole_name("程序员");
         
         u1.getRoles().add(role1);
         u1.getRoles().add(role2);
         
         u2.getRoles().add(role1);
         u2.getRoles().add(role2);
         
//       role1.getUsers().add(u1);
//       role1.getUsers().add(u2);
//       
//       role2.getUsers().add(u1);
//       role2.getUsers().add(u2);
         
         session.save(u1);
         session.save(u2);
         session.save(role1);
         session.save(role2);
         
        // ----------------------------------------------
        transaction.commit();
        session.close();
    }
    /**
     * 查询数据
     */
    @Test
    public void fun1() {
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();
        // ---------------------------------------------
        
        //hibernate懒加载   
        //当使用到对象的时候,才去执行sql
        //绝大程度上是好的
         User user = session.load(User.class, 1l);
        Set roles=user.getRoles();
        for(Role role:roles) {
            System.out.println(role.getRole_name());
        }
        
         Role role = session.load(Role.class, 1l);
            Set users=role.getUsers();
            for(User user_obj:users) {
                System.out.println(user_obj.getUser_name());
            }
        // ----------------------------------------------
        transaction.commit();
        session.close();
    }

总结

总结:多对多的关系不需要建立外键,只是建立一个虚拟的中间表。
只需要在两个多的一方实体中都有一个对方实体的集合就可以了。具体的实体映射文件详解如下:
user对象的映射文件:

            
                
            
            
        
配置详解:
name:是user实体中set集合对象的对象名。
table:是中间表的名字,随便取。但是两个中间表的名字要一样。
key:user表中的主键名字作为中间表的一个字段
many-to-many中的:
class:是另一个多的一方的实体名
column:是另一个多的一方中主键名。

当然,role的实体映射文件也是类似:如下

            
            
        

这里的name跟talbe以及key都不再讲解了,跟上面一样。
其实many-to-many也是一样配置的。
class是另一个多的一方的实体名,
column是另一个多的一方中的主键名。

你可能感兴趣的:(Hibernate映射关系之多对多(三))