Hibernate (一對多,多對一,多對多)配置

使用技術

  • idea開發工具
  • MySQL數據庫
  • hibernate ORM框架

項目整體結構
在這裏插入圖片描述
pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.aptech.hdax</groupId>
    <artifactId>TestMysqlHiber</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- hibernate核心-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.10.Final</version>
        </dependency>
        <!-- MySQL驅動jar-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <!--    Oracle JDBC驅動連接    -->
        <dependency>
            <groupId>oracle</groupId>
            <artifactId>oracle6g</artifactId>
            <version>11.12</version>
        </dependency>
        <!--    junit單元測試    -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <!--        lombok插件、簡化getter\setter-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>


</project>

hibernate.cfg.xml 配置文件

<?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>
    <!--    連接四個串-->
    <property name="connection.url">jdbc:mysql://localhost:3306/ry?serverTimezone=UTC</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.username">root</property>
    <property name="connection.password">root</property>
    <!--顯示查詢語句-->
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <!--    MySQL方言-->
<!--    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>-->
    <property name="dialect">org.hibernate.dialect.MySQL55Dialect</property>

    <!--    引入配置映射文件-->
    <mapping resource="mappers/SysUser.hbm.xml"/>
    <mapping resource="mappers/SysRole.hbm.xml"/>
    <mapping resource="mappers/SysDept.hbm.xml"/>
<!--    <mapping resource="org/aptech/hdax/pojo/Project.hbm.xml"/>-->

  </session-factory>
</hibernate-configuration>

實體類:用戶

package org.aptech.hdax.pojo;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;

/**
 * 用戶實體類
 */
@Getter
@Setter
public class SysUser implements Serializable {
    private Long userId;
    private SysDept sysDept;//用戶所屬部門
    private String loginName;
    private String userName;
    private String userType;
    private String email;
    private String phonenumber;
    private String sex;
    private String avatar;
    private String password;
    private String salt;
    private String status;
    private String delFlag;
    private String loginIp;
    private Timestamp loginDate;
    private String createBy;
    private Timestamp createTime;
    private String updateBy;
    private Timestamp updateTime;
    private String remark;
    //用戶對應角色、多對多
    private Set<SysRole> sysRoles = new HashSet<SysRole>();//用戶所屬的角色列表

}

實體類:部門

package org.aptech.hdax.pojo;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Set;

/**
 * 部門實體類
 */
@Getter
@Setter
public class SysDept implements Serializable {
    private Long deptId;
    //private Long parentId;//自引用
    private String ancestors;
    private String deptName;
    private Integer orderNum;
    private String leader;
    private String phone;
    private String email;
    private String status;
    private String delFlag;
    private String createBy;
    private Date createTime;
    private String updateBy;
    private Date updateTime;

    private SysDept parent;//父級部門

    //一對多
    private Set<SysDept> children;//子級部門集合(自引用)

}

實體類:角色

package org.aptech.hdax.pojo;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

/**
 * 角色實體類
 */
@Getter
@Setter
public class SysRole implements Serializable {
    private Long roleId;
    private String roleName;
    private String roleKey;
    private Integer roleSort;
    private String dataScope;
    private String status;
    private String delFlag;
    private String createBy;
    private Date createTime;
    private String updateBy;
    private Date updateTime;
    private String remark;
    //角色對應的用戶集合,多對多
    private Set<SysUser> sysUsers;

}

映射文件:SysUser.hbm.xml用戶

<?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="org.aptech.hdax.pojo.SysUser" table="sys_user" schema="ry">
        <!--  用戶id主鍵自增、手動賦值-->
        <id name="userId" column="user_id">
            <generator class="native"></generator>
        </id>
        <property name="loginName" column="login_name"/>
        <property name="userName" column="user_name"/>
        <property name="userType" column="user_type"/>
        <property name="email" column="email"/>
        <property name="phonenumber" column="phonenumber"/>
        <property name="sex" column="sex"/>
        <property name="avatar" column="avatar"/>
        <property name="password" column="password"/>
        <property name="salt" column="salt"/>
        <property name="status" column="status"/>
        <property name="delFlag" column="del_flag"/>
        <property name="loginIp" column="login_ip"/>
        <property name="loginDate" column="login_date"/>
        <property name="createBy" column="create_by"/>
        <property name="createTime" column="create_time"/>
        <property name="updateBy" column="update_by"/>
        <property name="updateTime" column="update_time"/>
        <property name="remark" column="remark"/>
        <!-- 多對一 默認是延遲加載查詢出是兩條語句、可以用一條語句連表語句查詢-->
        <many-to-one name="sysDept" class="org.aptech.hdax.pojo.SysDept" column="dept_id" fetch="join"/>

        <!-- 多對多、配置\ 多對多需要有關係表-->
        <set name="sysRoles" table="sys_user_role">
        <!--key用戶表的外鍵-->
            <key column="user_id"></key>
            <!-- 用戶誰和誰是多對多? 用戶和角色是多對多-->
            <many-to-many class="org.aptech.hdax.pojo.SysRole" column="role_id"/>
        </set>
    </class>
</hibernate-mapping>

映射文件:SysDept.hbm.xml 部門

<?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="org.aptech.hdax.pojo.SysDept" table="sys_dept" schema="ry">
        <id name="deptId" column="dept_id"/>
        <!--<property name="parentId" column="parent_id"/>-->
        <property name="ancestors" column="ancestors"/>
        <property name="deptName" column="dept_name"/>
        <property name="orderNum" column="order_num"/>
        <property name="leader" column="leader"/>
        <property name="phone" column="phone"/>
        <property name="email" column="email"/>
        <property name="status" column="status"/>
        <property name="delFlag" column="del_flag"/>
        <property name="createBy" column="create_by"/>
        <property name="createTime" column="create_time"/>
        <property name="updateBy" column="update_by"/>
        <property name="updateTime" column="update_time"/>

        <!--多對一-->
        <many-to-one name="parent" class="org.aptech.hdax.pojo.SysDept" column="parent_id"/>

        <!-- 一對多映射-->
        <set name="children" inverse="true">
            <key column="parent_id"></key>
            <one-to-many class="org.aptech.hdax.pojo.SysDept"/>
        </set>
    </class>
</hibernate-mapping>

映射文件:SysRole.hbm.xml 角色

<?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="org.aptech.hdax.pojo.SysRole" table="sys_role" schema="ry">
        <!--角色id主鍵自增、手動自增-->
        <id name="roleId" column="role_id">
            <generator class="native"></generator>
        </id>
        <property name="roleName" column="role_name"/>
        <property name="roleKey" column="role_key"/>
        <property name="roleSort" column="role_sort"/>
        <property name="dataScope" column="data_scope"/>
        <property name="status" column="status"/>
        <property name="delFlag" column="del_flag"/>
        <property name="createBy" column="create_by"/>
        <property name="createTime" column="create_time"/>
        <property name="updateBy" column="update_by"/>
        <property name="updateTime" column="update_time"/>
        <property name="remark" column="remark"/>

        <!-- 多對多、配置\ 多對多需要有關係表-->
        <set name="sysUsers" table="sys_user_role" inverse="true">
            <!--key角色表的外鍵-->
            <key column="role_id"></key>
            <!-- 角色誰和誰是多對多? 角色和用戶是多對多-->
            <many-to-many class="org.aptech.hdax.pojo.SysUser" column="user_id"/>
        </set>
    </class>
</hibernate-mapping>

Test 測試類

package org.aptech.hdax.test;

import org.aptech.hdax.pojo.SysDept;
import org.aptech.hdax.pojo.SysRole;
import org.aptech.hdax.pojo.SysUser;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class TestHiber {

    //查詢用戶所屬擁有哪些角色
    @Test
    public void testuserby(){
        //1、讀取配置文件
        Configuration config = new Configuration().configure();
        //2、構建session工廠
        SessionFactory sessionFactory = config.buildSessionFactory();
        //3、打開session
        Session session = sessionFactory.openSession();
        //4、操作事物
        Transaction tx = session.beginTransaction();

        SysUser sysUser = session.get(SysUser.class,1L);
        System.out.println(sysUser.getUserName());
        //循環用戶下有哪些角色
        for (SysRole sysRole : sysUser.getSysRoles()) {
            System.out.println(sysRole.getRoleName());
        }

        //5、提交事務
        tx.commit();
        //關閉session
        session.close();

    }

    //查詢角色擁有哪些用戶
    @Test
    public void testroleby(){
        //1、讀取配置文件
        Configuration config = new Configuration().configure();
        //2、構建session工廠
        SessionFactory sessionFactory = config.buildSessionFactory();
        //3、打開session
        Session session = sessionFactory.openSession();
        //4、操作事物
        Transaction tx = session.beginTransaction();

        SysRole sysRole = session.get(SysRole.class,1L);
        System.out.println(sysRole.getRoleName());
        //循環角色擁有哪些用戶
        for (SysUser sysUser:sysRole.getSysUsers()) {
            System.out.println(sysUser.getUserName());
        }

        //5、提交事務
        tx.commit();
        //關閉session
        session.close();

    }

    //查詢用戶擁有哪些部門
    @Test
    public void testdeptby(){
        //1、讀取配置文件
        Configuration config = new Configuration().configure();
        //2、構建session工廠
        SessionFactory sessionFactory = config.buildSessionFactory();
        //3、打開session
        Session session = sessionFactory.openSession();
        //4、操作事物
        Transaction tx = session.beginTransaction();

        //輸出用戶名稱,所在部門名稱
        SysUser sysUser = session.get(SysUser.class,1L);
        System.out.println(sysUser.getUserName());
        System.out.println(sysUser.getSysDept().getDeptName());

        //5、提交事務
        tx.commit();
        //關閉session
        session.close();

    }

    //查詢部門擁有哪些子級部門
    @Test
    public void testdeptparentby(){
        //1、讀取配置文件
        Configuration config = new Configuration().configure();
        //2、構建session工廠
        SessionFactory sessionFactory = config.buildSessionFactory();
        //3、打開session
        Session session = sessionFactory.openSession();
        //4、操作事物
        Transaction tx = session.beginTransaction();

        //輸出部門名稱
        SysDept sysDept = session.get(SysDept.class,101L);
        System.out.println(sysDept.getDeptName());
        //輸出父級名稱
        System.out.println(sysDept.getParent().getDeptName());

        //循環輸出子級部門
        for (SysDept child:sysDept.getChildren()) {
            System.out.println(child.getDeptName());
        }

        //5、提交事務
        tx.commit();
        //關閉session
        session.close();

    }


    //查詢部門擁有哪些子級部門
    @Test
    public void testdeptuseradd(){
        //1、讀取配置文件
        Configuration config = new Configuration().configure();
        //2、構建session工廠
        SessionFactory sessionFactory = config.buildSessionFactory();
        //3、打開session
        Session session = sessionFactory.openSession();
        //4、操作事物
        Transaction tx = session.beginTransaction();

        //查詢部門
        SysDept sysDept = session.get(SysDept.class,101L);
        //創建一個角色
        SysRole sysRole = new SysRole();
        sysRole.setRoleId(1L);
        //添加user
        SysUser sysUser = new SysUser();
        sysUser.setSysDept(sysDept);//查詢出101的部門
        sysUser.getSysRoles().add(sysRole);//角色爲1的
        sysUser.setLoginName("誒皮太殼");
        sysUser.setUserName("邯鄲翱翔");

        session.save(sysUser);


        //循環輸出子級部門
        for (SysDept child:sysDept.getChildren()) {
            System.out.println(child.getDeptName());
        }

        //5、提交事務
        tx.commit();
        //關閉session
        session.close();

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章