Hibernate基于配置文件的多对多级联CRUD操作

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();
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值