多对多关系,User和Role

1.创建表

CREATE TABLE `sys_role` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(255) DEFAULT NULL,
  `role_memo` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


CREATE TABLE `sys_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_code` varchar(255) DEFAULT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  `user_password` varchar(255) DEFAULT NULL,
  `user_state` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


CREATE TABLE `sys_user_role` (
  `user_id` int(11) NOT NULL,
  `role_id` int(11) NOT NULL,
  PRIMARY KEY (`user_id`,`role_id`),
  KEY `FK660C51789B2C831D` (`role_id`),
  KEY `FK660C5178405746FD` (`user_id`),
  CONSTRAINT `FK660C5178405746FD` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`),
  CONSTRAINT `FK660C51789B2C831D` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.创建实体

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

public class User {
       private Integer user_id;
       private String user_code;
       private String user_name;
       private String user_password;
       private String user_state;
       private Set<Role> role =new HashSet<>();
       
    public Set<Role> getRole() {
        return role;
    }
    public void setRole(Set<Role> role) {
        this.role = role;
    }
    public Integer getUser_id() {
        return user_id;
    }
    public void setUser_id(Integer 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 String getUser_state() {
        return user_state;
    }
    public void setUser_state(String user_state) {
        this.user_state = user_state;
    }
       
       
}
import java.util.HashSet;
import java.util.Set;

public class Role {
      private Integer role_id;
      private String  role_name;
      private String  role_memo;
      private Set<User> user=new HashSet<>();
      
    public Set<User> getUser() {
        return user;
    }
    public void setUser(Set<User> user) {
        this.user = user;
    }
    public Integer getRole_id() {
        return role_id;
    }
    public void setRole_id(Integer 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;
    }
      
}

3.创建配置文件,注意外键的两次设置

<?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="com.yqg.hibernate.entity">
       <class name="User" table="sys_user">
       <id name="user_id" column="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>
          <!-- 多对多关系 -->
          <set name="role" table="sys_user_role" cascade="save-update,delete">
              <key column="user_id"></key>
              <many-to-many class="Role" column="role_id"></many-to-many>
          </set>
       </class>
    </hibernate-mapping>
<?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="com.yqg.hibernate.entity">
    <class name="Role" table="sys_role">
       <id name="role_id" column="role_id">
       <generator class="native"></generator>
       </id>
       <property name="role_name" column="role_name"></property> 
       <property name="role_memo" column="role_memo"></property>
       <set name="user" table="sys_user_role" inverse="true" cascade="save-update,delete">
          <key column="role_id"></key>
          <many-to-many class="User" column="user_id"></many-to-many>
       </set>
    </class>
    </hibernate-mapping>

 

4.编写测试类

测试级联保存
/*
 * 多对多映射
 */

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.yqg.hibernate.entity.Role;
import com.yqg.hibernate.entity.User;
import com.yqg.hibernate.utils.hibernateUtils;

public class Demo1 {
  @Test
  //双向维护关系,注意被动的一方需要设置inverse为true,放弃维护外键
  public void Demo() {
      Session session = hibernateUtils.getCurrentSession();
      Transaction transaction = session.beginTransaction();
      User user=new User();
      user.setUser_name("ooo");
      User user1=new User();
      user1.setUser_name("ppp");
      Role role=new Role();
      role.setRole_name("uuu");
      Role role2=new Role();
      role2.setRole_name("rrr");
      Role role3=new Role();
      role3.setRole_name("fff");
      
      user.getRole().add(role);
      user.getRole().add(role2);
      user.getRole().add(role3);
      user1.getRole().add(role);
      user1.getRole().add(role2);
      user1.getRole().add(role3);
      
      role.getUser().add(user1);
      role.getUser().add(user);
      role2.getUser().add(user1);
      role2.getUser().add(user);
      role3.getUser().add(user1);
      role3.getUser().add(user);
      
//      session.save(user1);
//      session.save(user);
      session.save(role);
      session.save(role2);
      session.save(role3);
      transaction.commit();
  }
}
测试级联删除,注意删除时后两个用户不能有相同的角色重叠,否则会报外键错误。
import org.hibernate.Session;
import org.hibernate.Transaction;
/*级联删除
 * */
import org.junit.Test;

import com.yqg.hibernate.entity.Role;
import com.yqg.hibernate.entity.User;
import com.yqg.hibernate.utils.hibernateUtils;

public class Demo2 {
   @Test
   public void demo() {
       Session session = hibernateUtils.getCurrentSession();
          Transaction transaction = session.beginTransaction();
//          User user = (User) session.get(User.class, 1);
//          session.delete(user);
         Role role = (Role) session.get(Role.class, 2);
          session.delete(role);
          transaction.commit();
      
   }
}

5.注意点

不要忘了在核心配置文件配置资源文件。