1. 程式人生 > >Hibernate 學習筆記 之 多對多關係 及其 級聯操作

Hibernate 學習筆記 之 多對多關係 及其 級聯操作

一、多對多配置

這裡寫圖片描述
這裡寫圖片描述

User.java

/**
 * Created by Donald on 2016/11/20.
 */
public class User {
    private Integer user_id; //使用者id
    private String user_name; //使用者名稱
    private String user_password; //使用者密碼

    //一個使用者可以有多個角色
    private Set<Role> setRole = new HashSet<Role>();

    public Set<Role> getSetRole
() { return setRole; } public void setSetRole(Set<Role> setRole) { this.setRole = setRole; } public Integer getUser_id() { return user_id; } public void setUser_id(Integer 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_password() { return user_password; } public void setUser_password(String user_password) { this.user_password = user_password; } }

Role.java

/**
 * Created by Donald on 2016/11/20.
 */
public class Role {
    private Integer role_id;    //角色id
    private String role_name;   //角色名稱
    private String role_memo;   //角色描述

    //角色表示多個使用者
    private Set<User> setUser = new HashSet<User>();

    public Set<User> getSetUser() {
        return setUser;
    }

    public void setSetUser(Set<User> setUser) {
        this.setUser = setUser;
    }

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

這裡寫圖片描述

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 1.配置類和表對應
        class標籤
        name屬性,實體類
        table屬性,資料表名稱
        -->
    <class name="com.yyf.manytomany.User" table="t_user">
        <id name="user_id" column="user_id">
            <generator class="native"></generator>
        </id>
        <property name="user_name" column="user_name" ></property>
        <property name="user_password" column="user_password"></property>

        <set name="setRole" table="user_role">

            <key column="userid"></key>
            <!--
                class,角色實體類全路徑
                column,角色在第三張表外來鍵名稱
            -->
            <many-to-many  class="com.yyf.manytomany.Role" column="roleid"/>
        </set>
    </class>
</hibernate-mapping>

這裡寫圖片描述

Role.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 1.配置類和表對應
        class標籤
        name屬性,實體類
        table屬性,資料表名稱
        -->
    <class name="com.yyf.manytomany.Role" table="t_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="setUser" table="user_role">

            <key column="roleid"></key>

            <many-to-many  class="com.yyf.manytomany.User" column="userid"/>
        </set>
    </class>
</hibernate-mapping>

二、級聯操作—-儲存

這裡寫圖片描述

若無save-update則儲存不成功。

測試:

/**
     * 新增兩個使用者,為每個使用者新增兩個角色
     */

    @Test
    public void testSave() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try{
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();

            User user1 = new User();
            user1.setUser_name("lucy");
            user1.setUser_password("123");

            User user2 = new User();
            user2.setUser_name("mary");
            user2.setUser_password("456");

            Role role1 = new Role();
            role1.setRole_name("總經理");
            role1.setRole_memo("總經理");

            Role role2 = new Role();
            role2.setRole_name("祕書");
            role2.setRole_memo("祕書");

            Role role3 = new Role();
            role3.setRole_name("保安");
            role3.setRole_memo("保安");

            //2. 建立關係,把角色放到使用者裡面
            //user1 ----r1/r2
            user1.getSetRole().add(role1);
            user1.getSetRole().add(role2);
            //user2 ----r2/r3
            user2.getSetRole().add(role2);
            user2.getSetRole().add(role3);

            //3.儲存使用者
            session.save(user1);
            session.save(user2);

            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }
    }

三、級聯操作—-刪除

這種刪除會將關聯的所有的資料刪除

@Test
    public void testDelete2() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try{
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();

            User user = session.get(User.class, 3);
            session.delete(user);

            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }
    }

四、級聯操作—-維護第三張表

其實主要操作set

   /**
     * 1.使用者和角色多對多關係,維護關係通過第三張表維護
     *
     * 2.讓某個使用者有某個角色
     * ① 根據id查詢使用者和角色
     * ②把角色物件放到使用者set集合
     *
     * 3.讓某個使用者沒有某個角色
     * ①根據id查詢使用者和角色
     * ②從使用者裡面把角色去掉
     *
     */
    @Test
    public void testOperator() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try{
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();

            /**
             * 讓某個使用者有某個角色
             * 讓lucy有經紀人角色
             *
             * 1.查詢lucy和經濟人
             * 2.放入user的set裡
             */

//            User lucy = session.get(User.class, 1);
//            Role role = session.get(Role.class, 1);
//
//            lucy.getSetRole().add(role);

            /**
             * 刪除操作
             */
            User user = session.get(User.class, 4);
            Role role = session.get(Role.class, 3);

            user.getSetRole().remove(role);

            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }
    }