1.建立用户表和角色表,一个用户可以演多个角色,一个角色也可以由多个用户来演
CREATE TABLE `sys_user` (
`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_code` varchar(32) NOT NULL COMMENT '用户账号',
`user_name` varchar(64) NOT NULL COMMENT '用户名称',
`user_password` varchar(32) NOT NULL COMMENT '用户密码',
`user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
CREATE TABLE `sys_role` (
`role_id` bigint(32) NOT NULL AUTO_INCREMENT,
`role_name` varchar(100) DEFAULT NULL,
`role_memo` varchar(255) DEFAULT NULL,
PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
2.编辑配置文件,和一对多没什么区别
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--1.连接数据库的信息-->
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!--2.hibernate可选配置-->
<!--检测实体类的映射配置和数据库的表结构是否一致,如果不一致,更新表结构-->
<property name="hbm2ddl.auto">update</property>
<!--数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--是否显示hibernate生成的sql语句-->
<property name="hibernate.show_sql">true</property>
<!--是否使用格式化输出sql语句-->
<property name="hibernate.format_sql">true</property>
<!--3.设置hibernate的连接池提供商-->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!--4.映射文件的位置-->
<mapping resource="domain/SysRole.hbm.xml"/>
<mapping class="domain.SysRole"/>
<mapping class="domain.SysUser"/>
<mapping resource="domain/SysUser.hbm.xml"/>
<!-- DB schema will be updated if needed -->
<!-- <property name="hbm2ddl.auto">update</property> -->
</session-factory>
</hibernate-configuration>
3.使用idea反向生成实体类和映射文件
用户实体类,其中用set表示角色
package domain;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* @Author: David.Xiao
* @Date: 2018/11/12 22:32
* @Description:
*/
@Entity
@Table(name = "sys_user", schema = "hibernate", catalog = "")
public class SysUser {
private long userId;
private String userCode;
private String userName;
private String userPassword;
private String userState;
public Set<SysRole> getRoleSet() {
return roleSet;
}
public void setRoleSet(Set<SysRole> roleSet) {
this.roleSet = roleSet;
}
private Set<SysRole> roleSet = new HashSet<>(0);
@Id
@Column(name = "user_id")
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
@Basic
@Column(name = "user_code")
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
@Basic
@Column(name = "user_name")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Basic
@Column(name = "user_password")
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
@Basic
@Column(name = "user_state")
public String getUserState() {
return userState;
}
public void setUserState(String userState) {
this.userState = userState;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SysUser sysUser = (SysUser) o;
return userId == sysUser.userId &&
Objects.equals(userCode, sysUser.userCode) &&
Objects.equals(userName, sysUser.userName) &&
Objects.equals(userPassword, sysUser.userPassword) &&
Objects.equals(userState, sysUser.userState);
}
@Override
public int hashCode() {
return Objects.hash(userId, userCode, userName, userPassword, userState);
}
@Override
public String toString() {
return "SysUser{" +
"userId=" + userId +
", userCode='" + userCode + '\'' +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
", userState='" + userState + '\'' +
'}';
}
}
用户映射文件,同样配置set标签和inverse,cascade属性
<?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="domain.SysUser" table="sys_user" schema="hibernate">
<id name="userId" column="user_id">
<generator class="increment"></generator>
</id>
<property name="userCode" column="user_code"/>
<property name="userName" column="user_name"/>
<property name="userPassword" column="user_password"/>
<property name="userState" column="user_state"/>
<set name="roleSet" table="sys_user_role" inverse="true" cascade="delete">
<key column="user_id"></key>
<many-to-many column="role_id" class="domain.SysRole"></many-to-many>
</set>
</class>
</hibernate-mapping>
角色实体类,用set集合表示用户
package domain;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* @Author: David.Xiao
* @Date: 2018/11/12 22:31
* @Description:
*/
@Entity
@Table(name = "sys_role", schema = "hibernate", catalog = "")
public class SysRole {
private long roleId;
private String roleName;
private String roleMemo;
public Set<SysUser> getUserSet() {
return userSet;
}
public void setUserSet(Set<SysUser> userSet) {
this.userSet = userSet;
}
private Set<SysUser> userSet = new HashSet<>(0);
@Id
@Column(name = "role_id")
public long getRoleId() {
return roleId;
}
public void setRoleId(long roleId) {
this.roleId = roleId;
}
@Basic
@Column(name = "role_name")
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
@Basic
@Column(name = "role_memo")
public String getRoleMemo() {
return roleMemo;
}
public void setRoleMemo(String roleMemo) {
this.roleMemo = roleMemo;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SysRole sysRole = (SysRole) o;
return roleId == sysRole.roleId &&
Objects.equals(roleName, sysRole.roleName) &&
Objects.equals(roleMemo, sysRole.roleMemo);
}
@Override
public int hashCode() {
return Objects.hash(roleId, roleName, roleMemo);
}
@Override
public String toString() {
return "SysRole{" +
"roleId=" + roleId +
", roleName='" + roleName + '\'' +
", roleMemo='" + roleMemo + '\'' +
'}';
}
}
角色映射文件,同样也要配置set标签以及cascade属性
<?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="domain">
<class name="domain.SysRole" table="sys_role" schema="hibernate">
<id name="roleId" column="role_id">
<generator class="increment"></generator>
</id>
<property name="roleName" column="role_name"/>
<property name="roleMemo" column="role_memo"/>
<!--set:-->
<!--name:集合的名称-->
<!--table:中间表的名称-->
<!--key:用于映射外键字段-->
<!--column:当前实体在中间表的外键字段名称-->
<!--many-to-many:映射多对多的关系-->
<!--class:对方实体类名称-->
<!--column:对方实体在中间表的外键字段名称-->
<set name="userSet" table="sys_user_role" cascade="delete">
<key column="role_id"></key>
<many-to-many column="user_id" class="domain.SysUser"></many-to-many>
</set>
</class>
</hibernate-mapping>
4.多对多的级联操作,和一对多很相似
package dao;
import domain.SysRole;
import domain.SysUser;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* @Author: David.Xiao
* @Date: 2018/11/12 23:02
* @Description:
*/
public class Many2ManyTest {
@Test
public void openSession() {
}
/**
* 多对多保存操作
* 新建用户1,并拥有r1和r2角色
* 新建用户2,并拥有r2和r3角色
*/
@Test
public void save()
{
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
SysUser user1 = new SysUser();
user1.setUserCode("user1");
user1.setUserName("luyuchen");
user1.setUserPassword("123456");
user1.setUserState("y");
SysUser user2 = new SysUser();
user2.setUserCode("user2");
user2.setUserName("wangming");
user2.setUserPassword("123456");
user2.setUserState("y");
SysRole role1 = new SysRole();
role1.setRoleName("甄嬛");
role1.setRoleMemo("这是一个很好的角色");
SysRole role2 = new SysRole();
role2.setRoleName("小燕子");
role2.setRoleMemo("这是一个很活泼的角色");
SysRole role3 = new SysRole();
role3.setRoleName("汉武大帝");
role3.setRoleMemo("这是一个很严肃的角色");
user1.getRoleSet().add(role1);
user1.getRoleSet().add(role2);
user2.getRoleSet().add(role2);
user2.getRoleSet().add(role3);
role1.getUserSet().add(user1);
role2.getUserSet().add(user1);
role2.getUserSet().add(user2);
role3.getUserSet().add(user2);
//在hbm分别添加了cascade save-update后,保存和更新操作只要对一方进行即可
session.save(user1);
session.save(user2);
// session.save(role1);
// session.save(role2);
// session.save(role3);
tx.commit();
}
/**
* 多对多删除操作
* 实际开发中基本不用,容易误删多个数据
*/
@Test
public void delete()
{
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
SysUser user3 = session.get(SysUser.class,2L);
session.delete(user3);
tx.commit();
}
}