1. 程式人生 > >Java之hibernate表間關係

Java之hibernate表間關係

一對多

一對多
Customer實體類

表示一對多關係的容器:
    // 容器必須初始化才能儲存東西
    private Set<LinkMan> linkMans = new HashSet<>();

LinkMan實體類

    // 使用一的物件來表示表與表之間的關係
    private Customer customer;

Customer.hbm.xml

<hibernate-mapping package="com.lanou3g.bean">
    <class name="Customer" table="cst_customer"
>
<id name="cust_id" column="cust_id"> <generator class="native"></generator> </id> <property name="cust_name" column="cust_name" ></property> <property name="cust_source" column="cust_source" ></property> <property
name="cust_industry" column="cust_industry" >
</property> <property name="cust_level" column="cust_level" ></property> <property name="cust_linkman" column="cust_linkman" ></property> <property name="cust_phone" column="cust_phone" ></property
>
<property name="cust_mobile" column="cust_mobile" ></property> <!-- 配置表關係的容器 --> <!-- name:實體類中容器的屬性名 column:表中的外來鍵名 class:表示一對多中 多表的類(全類名) inverse 控制是否維護外來鍵關係 預設維護外來鍵的關係 預設值false 結語 inverse 可以減少hibernate 無用操作 提高效率 cascade 級聯操作 減少點程式碼 save-update delete all == save-update + delete 如果要用級聯操作 就用save-update 請慎用delete --> <set name="linkMans" inverse="true"> <key column="lkm_cust_id"></key> <one-to-many class="LinkMan"/> </set> </class> </hibernate-mapping>

LinkMan.hbm.xml

<hibernate-mapping package="com.lanou3g.bean">
    <class name="LinkMan" table="cst_linkman">
        <id name="lkm_id" column="lkm_id">
            <generator class="native"></generator>
        </id>
        <property name="lkm_name" column="lkm_name" ></property>

        <property name="lkm_gender" column="lkm_gender" ></property>
        <property name="lkm_phone" column="lkm_phone" ></property>
        <property name="lkm_mobile" column="lkm_mobile" ></property>
        <property name="lkm_email" column="lkm_email" ></property>
        <property name="lkm_qq" column="lkm_qq" ></property>
        <property name="lkm_position" column="lkm_position" ></property>
        <property name="lkm_memo" column="lkm_memo" ></property>

        <!-- 配置表關係 -->
        <!-- 
            name:表示關係的物件的屬性名
            column:表中的外來鍵名
            class:多對一關係中 對應的實體類名(全類名)
            注意:外來鍵的屬性 不要重複配置
         -->
        <many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>

    </class>
</hibernate-mapping>

測試新增一個客戶 兩個聯絡人

    @Test
    public void fun1() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

        // 建立客戶
        Customer customer = new Customer();
        customer.setCust_name("lanou");
        // 建立聯絡人
        LinkMan linkMan1 = new LinkMan();
        linkMan1.setLkm_name("wl");
        LinkMan linkMan2 = new LinkMan();
        linkMan2.setLkm_name("lck");
        // 新增實體類中的關係
        // 把聯絡人新增到集合中
        customer.getLinkMans().add(linkMan1);
        customer.getLinkMans().add(linkMan2);
        // 給聯絡人設定客戶
        linkMan1.setCustomer(customer);
        linkMan2.setCustomer(customer);
        // 儲存到資料庫
        session.save(customer);
        session.save(linkMan1);
        session.save(linkMan2);

        transaction.commit();
        session.close();
    }


對hibernate執行的sql語句的優化
    列印的插入語句 是linkman在維護自己的表
    並且在插入的時候 已經插入了外來鍵(外來鍵已經有了)
    列印的更新語句 是Customer來維護從而打印出來的
    這裡對外來鍵的維護 兩個表都維護一遍 造成了多餘的sql語句操作
    使用inverse控制是否維護外來鍵關係

刪除客戶為1的id為2的聯絡人

    @Test
    public void fun2() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

        // 獲取id為1的客戶
        // 持久態 在事務提交的時候 如果該物件被修改了 那麼修改的資料 會被同步到資料庫中
        Customer customer = session.get(Customer.class, 1l);
        // 獲取id為2的聯絡人
        LinkMan linkMan = session.get(LinkMan.class, 2l);
        // 處理實體類的關係
        customer.getLinkMans().remove(linkMan);
        linkMan.setCustomer(null);
        // 從資料庫中刪除
        session.delete(linkMan);

        transaction.commit();
        session.close();
    }

為客戶id為1 新增聯絡人

    @Test
    public void fun3() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

        // 獲取id為1的客戶
        Customer customer = session.get(Customer.class, 1l);
        // 建立聯絡人
        LinkMan linkMan = new LinkMan();
        linkMan.setLkm_name("zs");
        // 處理實體類的關係
        customer.getLinkMans().add(linkMan);
        linkMan.setCustomer(customer);
        // 儲存到資料庫
        session.save(linkMan);


        transaction.commit();
        session.close();
    }

測試級聯操作(可以讓你減少幾行程式碼的工作量)

save-update:
    public void fun4() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

        Customer customer = new Customer();
        customer.setCust_name("JD");
        LinkMan linkMan = new LinkMan();
        linkMan.setLkm_name("lsy");
        customer.getLinkMans().add(linkMan);
        //linkMan.setCustomer(customer);
        session.save(customer);
        //session.save(linkMan);

        transaction.commit();
        session.close();
    }
delete:
    @Test
    public void fun5() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

        Customer customer = session.get(Customer.class, 1l);
        session.delete(customer);

        transaction.commit();
        session.close();
    }

多對多

多對多
User實體類

    // 表示多對多關係
    private Set<Role> roles = new HashSet<>();

Role實體類

    // 表示多對多關係
    private Set<User> users = new HashSet<>();

User.hbm.xml

<hibernate-mapping package="com.lanou3g.bean">
    <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>

        <!-- 表示多對多關係 -->
        <!-- 
            name:對應容器的名
            table:中間表的名字
            column:被引用的外來鍵
            *****************
            class:與之對應的表的類名(全類名)
            column: 前面class中被引用的外來鍵
         -->
        <set name="roles" table="sys_user_role" inverse="true">
            <key column="user_id"></key>
            <many-to-many class="Role" column="role_id"></many-to-many>
        </set>

    </class>
</hibernate-mapping>

Role.hbm.xml

<hibernate-mapping package="com.lanou3g.bean">
    <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="users" table="sys_user_role">
            <key column="role_id"></key>
            <many-to-many class="User" column="user_id"></many-to-many>
        </set>

    </class>
</hibernate-mapping>

儲存兩個員工兩個角色

    @Test
    public void fun1() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

        User user1 = new User();
        user1.setUser_name("sc");
        User user2 = new User();
        user2.setUser_name("kd");

        Role role1 = new Role();
        role1.setRole_name("保鏢");
        Role role2 = new Role();
        role2.setRole_name("保姆");

        user1.getRoles().add(role1);
        user1.getRoles().add(role2);
        user2.getRoles().add(role1);
        user2.getRoles().add(role2);
        role1.getUsers().add(user1);
        role1.getUsers().add(user2);
        role2.getUsers().add(user1);
        role2.getUsers().add(user2);

        session.save(user1);        
        session.save(user2);        
        session.save(role1);        
        session.save(role2);        

        transaction.commit();
        session.close();
    }

每個表預設都會維護自己的外來鍵關係
中間表使用的聯合主鍵 如果兩張表都維護外來鍵關係
也就是說 都會對中間表進行操作 這時會發生重複插入相同的外來鍵值
注意:所以多對多操作必須要有一張表放棄對外來鍵關係的維護

為id為1的員工增加一個角色

    @Test
    public void fun2() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

        User user = session.get(User.class, 1l);

        Role role = new Role();
        role.setRole_name("保潔");
        // 注意雙側關係都要新增上
        user.getRoles().add(role);
        role.getUsers().add(user);

        session.save(role);

        transaction.commit();
        session.close();
    }

為id為1的員工解除一個角色

    @Test
    public void fun3() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

        User user = session.get(User.class, 1l);
        Role role = session.get(Role.class, 2l);
        user.getRoles().remove(role);
        role.getUsers().remove(user);

        session.save(user);
        session.save(role);

        transaction.commit();
        session.close();
    }

相關推薦

Javahibernate關係

一對多 Customer實體類 表示一對多關係的容器: // 容器必須初始化才能儲存東西 private Set<LinkMan> linkMans = new HashSet<>(); LinkMan實體類

Node.js ORM框架Sequlize關係

1 /** 2 * 大家就按照我的步驟來,一點一點,要有耐心哦 3 * 我相信,最後肯定有你想要的!加油 4 */ 5 //引入框架 6 const Sequelize = require('sequelize'); 7 //建立ORM例項 8 const sequel

MYSQL查詢查詢、子查詢及關係

一對一關係 一對一的表關係: 例如:qq和qq的詳盡資訊 建立外來鍵的時候 如果明確主從關係? 被引用的表是主表,外來鍵在從表中建立 關聯主表 實現程式碼如下: CREATE TABLE qq( qqid

# Mybatis(四)關係分析,高階對映(一對一,一對多,多對多) 菜鳥日記--day05(下_02)

Mybatis(四)表間關係分析,高階對映(一對一,一對多,多對多) 菜鳥日記–day05(下_02) 花了很多時間,去看sql複雜查詢,更新慢了 電腦斷電寫的太急,綠色補更 一、表間關係分析 1.分析資料庫表的方法 思路: 需要分模組的對多張表進行邏輯分析 表記錄

SAP-MM採購訂單相關的主要後臺關係

主要的表及描述如下: 1.相關表列舉說明 EKPO 採購憑證專案 EKKO 採購憑證擡頭 EORD 採購貨源清單 EINA 採購資訊記錄 - 一般資料 EINE 採購資訊記錄 - 採購組織資料 EKET 計劃協議計劃行 EKES 供應商確認 EKKN 採購憑證中的帳

SQL server基礎關聯)

首先先準備一些資料 --E-R圖 --學生(學號,姓名,性別,生日,班級,密碼) --課程(編號,課程) --分數(學號,編號,分數) (學生表:Student) (課程表:KC) (分數表:Coure) 很簡單的三個表。。接著我們來用幾種常見的連線方法把三張表連線在

java 執行緒變數共享

import java.util.Random; public class StaticTest { private static int data = 0; public static void main(String[] args) { //開三個執行緒

javafinalize在繼承關係中的使用

轉載請註明出處 http://blog.csdn.net/pony_maggie/article/details/44524077 作者:小馬 假設在基類BaseA中過載了finalize,如果繼承類DerivedA中也要過載finalize,一定要先呼叫基類的版

Hibernate關系

關系數據庫 creat arc shc vat arr 單向 ring array ManyToOne 多對一,是最常見的表間關系,對應關系數據庫中的外鍵關系。通常用於建立子實體和其父實體的關聯關系 @Entity(name = "Person") pu

Java程式設計師從笨鳥到菜鳥(五十四)細談Hibernate(五)Hibernate一對多關係對映

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                       前幾篇系列部落格:           在前幾篇部落格,我們初步對Hibernate有了一定的基礎性的認知了,也能夠簡單的用hibernate進行

java】itoo項目實戰hibernate 懶載入優化性能

bsp xtra extra pda 程序 前端框架 外連接 獲取 轉換成 在做itoo 3.0 的時候,考評系統想要上線,就開始導入數據了,僅僅導入學生2萬條數據,可是導入的速度特別的慢。這個慢的原因是由於導入的時候進行了過多的IO操作。可是導入成功之後,

java】itoo項目實戰hibernate 批量保存優化

新的 hibernate 缺點 try 實戰 lis 插入 entity man 在itoo中。基本上每一個系統都有一個導入功能,大量的數據填寫進入excel模板中。然後使用導入功能導入的數據庫中,這樣能夠大大的提高工作效率。那麽導入就涉及到了批量保存數據庫的

hibernate 關系映射詳解繼承關系

子類 用戶 .cn cnblogs -1 擁有 nat src 實體類 舉例:亞馬遜的網上商城可以賣很多東西,比如說圖書,電器,水果等等,那麽我們以面向對象的理念去抽象一個商品類,他具有商品的共有屬性,比如說上架時間,當前 價格,優惠價格等待,商品可以繼承商

Javahibernate(3)——第一個hibernate的樣例

數據庫方言 自由 article 存儲 代理 mit rup 方便 post  在解說樣例之前。我們首先來理解一下hibernate的工作原理。理解原理將會幫助我們更好地理解hibernate和運用hibernate。  1. 原理圖   利用hibe

Java並發線程協作Object的wait()、notify()、notifyAll()

它的 ring sleep方法 子類 string exce 程序退出 data- 差異 wait()、notify()和notifyAll()是Object類中的方法: 1)wait()、notify()和notifyAll()方法是本地方法,而且為fina

【數據結構】順序Java語言描述)

arraylist 表數據 nbsp real 不同 1.5 根據 長度 tar   之前總結過使用C語言描述的順序表數據結構。在C語言類庫中沒有為我們提供順序表的數據結構,因此我們需要自己手寫,詳細的有關順序表的數據結構描述和C語言代碼請見【我的這篇文章】。   在Jav

Hibernate裏面有連接,查詢一個出org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: 聯系的類名 異常

延遲加載 配置文件 poj led 希望 java main.c exceptio 加載 這個問題我學Hibernate的時候遇到了,各種方法都試過,兩天才查出了,不過學的不是很深。感覺是因為表間聯系才出的問題。 最近又有人來問我這個問題,他是其他的都能查出來,但是排序查詢

Java並發工具類線程數據交換工具Exchanger

catch exchanger 系統 chang data 完成後 () time ktr   Exchanger是一個用於線程間協做的工具類,主要用於線程間的數據交換。它提供了一個同步點,在這個同步點,兩個線程可以彼此交換數據。兩個線程通過exchange方法交換數據,如

Hibernate初探映射

每次 otf 程序 nat 關系 領域 持久 對象類型 維護 http://www.imooc.com/video/78161.什麽是ORM?為什麽使用Hibernate? 對象關系映射;為了少寫和底層數據庫相關的sql語句,方便程序的維護、修改,提高跨平臺性和可擴展性。

Java數據結構單鏈

java 數據結構 單鏈表 鏈表的組成:鏈表頭+結點? ?鏈表頭一般只存儲下一個節點的引用? ?節點:存數據+下一個節點的引用鏈表頭代碼:package?com.xingej.algorithm.datastructure.linkedList.singleLinkedList; /** ?*?