1. 程式人生 > >【SSH三大框架】Hibernate基礎第七篇:一對多關聯關係的操作

【SSH三大框架】Hibernate基礎第七篇:一對多關聯關係的操作

相對於上文的多對一關係,這裡又說明下一對多的關聯關係。

在上文中,我們描述了多對一的關係,在關係資料庫中也是多對一的關係,並且還是一對多的關係。但是,僅僅如此是不夠的,Hibernate是一種面向物件的結構,在Hibernate中仍然是多對一的關係,但是沒有一對多,所以我們需要額外新增一對多的關係。

部門實體類:Department.java

package cn.itcast.hibernate.domain;

import java.util.Set;

public class Department {  
    private int id;  
    private String name;  
    private Set<Employee> emps;
    
    public Set<Employee> getEmps() {
		return emps;
	}
	public void setEmps(Set<Employee> emps) {
		this.emps = emps;
	}
	public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
}  

部門對映關係:Department.hbm.xml

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping   
    package="cn.itcast.hibernate.domain">  
  
    <class name="Department" table="tb_Department">  
        <id name="id">  
            <generator class="native"/>   
        </id>  
        <property name="name" />  
        
        <set name="emps">
        	<key column="depart_id" />
        	<one-to-many class="Employee" />
        </set>
    </class>  
      
</hibernate-mapping>  
我們需要注意的是:在部門實體類中,我們增加了一個set集合屬性,並且在對映檔案中我們也增加了一個set屬性,這是為了對映一對多的關係。

在對映檔案中的set標籤,我們定義了一個key標籤,這是外來鍵,必須與員工類的外來鍵相同。

員工實體類:Employee.java
package cn.itcast.hibernate.domain;

public class Employee {  
    private int id;  
    private String name;  
    private Department depart;  
      
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public Department getDepart() {  
        return depart;  
    }  
    public void setDepart(Department depart) {  
        this.depart = depart;  
    }  
}  
員工對映關係:Employee.hbm.xml
<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping   
    package="cn.itcast.hibernate.domain">  
    <class name="Employee" table="tb_Employee">  
        <id name="id">  
            <generator class="native"/>   
        </id>  
        <property name="name" />  
        <many-to-one name="depart" column="depart_id" />  
    </class>  
      
</hibernate-mapping>  
接下來,我們寫一個測試的類:Many2One.java
public class Many2One {  
    public static void main(String[] arg){  
        Department depart = add();  
        query(depart.getId()); 
    }  
      
    static Department add(){  
        Session s = null;  
        Transaction tx = null;  
        try{  
            Department depart = new Department();  
            depart.setName("depart name");  
              
            Employee emp1 = new Employee();  
            emp1.setDepart(depart); //建立兩個物件的關聯關係  
            emp1.setName("emp name");  
            
            Employee emp2 = new Employee();  
            emp2.setDepart(depart); //建立兩個物件的關聯關係  
            emp2.setName("emp name");  
              
            s = HibernateUtil.getSession();  
            tx = s.beginTransaction();  
            s.save(depart);
            s.save(emp1);   //emp物件和depart物件儲存的先後順序不同也會有一定的差異  
            s.save(emp2); //如果員工(emp)先插入,部門(depart)後插入,會生成三條資料庫語句,  
                            //因為在兩者都插入之後,emp的depart_id欄位還未插入,所以還要有最後一條語句插入  
            tx.commit();  
            return depart;  
        }finally{  
            if(s!=null){  
                s.close();  
            }  
        }  
    }  
      
    static Department query(int departId){  
        Session s = null;  
        Transaction tx = null;  
        try{  
            s = HibernateUtil.getSession();  
            tx = s.beginTransaction();  
            Department depart = (Department)s.get(Department.class, departId); //根據ID查詢  
            System.out.println("emp size:"+depart.getEmps().size());
            //Hibernate.initialize(depart.getEmps());
            tx.commit();  
            return depart;  
        }finally{  
            if(s!=null){  
                s.close();  
            }  
        }  
    }  
}  
在main函式中,我們添加了兩個資料,然後查詢部門id,可以得到兩個結果。

相關推薦

SSH三大框架Hibernate基礎一對關聯關係操作

相對於上文的多對一關係,這裡又說明下一對多的關聯關係。 在上文中,我們描述了多對一的關係,在關係資料庫中也是多對一的關係,並且還是一對多的關係。但是,僅僅如此是不夠的,Hibernate是一種面向物件的結構,在Hibernate中仍然是多對一的關係,但是沒有一對多,所以我們

SSH三大框架Hibernate基礎十三lazy、constrained、fetch三個屬性的作用和使用方法

這三個屬性,個人感覺對於懶載入是很重要的,所以又重新開了一篇部落格來寫下這三個屬性的作用和使用方法 一、lazy屬性: lazy概念:只有真正使用該物件時,才會建立。對於hibernate而言,真正使用時才會發出SQL語句 1、在集合中定義: <set name

SSH三大框架Struts2基礎log4j打印出日誌資訊

把這個歸於Struts2是不太合適的,因為log4j是一個開源的程式碼專案,不僅僅可以用在Struts2上。 我們介紹一下log4j:通過使用log4j,我們可以把一些資訊輸出到控制檯、文字檔案、html檔案等等中 首先,建立一個java project,我們建立一個li

SSH三大框架Struts2基礎配置Action以及呼叫Action的三種方式

一、struts.xml中的包和名稱空間 1、Struts2不支援為單獨的Action設定名稱空間,而是通過為包指定namespace屬性來為包下面的所有Action指定共同的名稱空間。 如果在配置<package>的時候沒有指定namespace屬性,則該包下

SSH三大框架Hibernate基礎十二load()懶載入分析以及一對一、一對對一、懶載入的分析

一、懶載入的定義: 懶載入:在WEB應用程式中,經常會需要查詢資料庫,系統的響應速度在很大程度上是與資料庫互動的響應。因此,如果能夠優化與資料庫的互動速度,則能夠大大提高WEB應用的響應速度。 例如:當有一個Student類和一個Teacher類。當我們載入一個學生的所有資

SSH三大框架Spring基礎第二Spring依賴注入的三種方式

控制反轉(Inversion of Control)和依賴注入(Dependency Injection):應用控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體將其所依賴的物件的引用傳遞給它。也可以說,依賴被注入到物件中。所以,控制反轉是,關於一個物件如何獲

7章 對映一對關聯關係

以客戶和訂單的關係為例,一個客戶能發出多個訂單,而一個訂單(order)只能屬於一個客戶(customer)。從訂單到客戶的關聯是多對一關聯,這意味著每個訂單物件都會引用一個客戶物件,因此在訂單類中應該定義一個客戶型別的屬性,來引用關聯的客戶物件。 從客戶到訂單是一對多的關聯,這意味著每個客

Mybatisjava三大框架

三大框架和三層架構 ssm: SpringMVC  Spring Framework  Mybatis 三層架構:        表示層:   與客戶端實現互動。  &

雲棲直播精彩推薦2期首屆阿裏巴巴研發效能嘉年華

heron 企業 microsoft 新聞發布會 ram 認證 場景 center 升級 熱門推薦 (1)架構研發 持續集成與交付:阿裏最佳實踐 >>[立即預約] 直播簡介:本系列直播由阿裏旗下一站式研發提效平臺雲效策劃推出,主要為大家詳細介

設計模式和我一起簡單認識橋接模式

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e2a06bdecb6944c89988b5813a39bc13~tplv-k3u1fbpfcp-zoom-1.image) # 一 引言 橋接模式理解起來也是非常簡單,我們仍然從生活中的問題出發,

Python基礎函數

turn 說明 代碼 名稱 維護 span 大小寫 div 邏輯 一、Python函數介紹 1.函數的作用 規範代碼使代碼變得邏輯性更強 提高可讀性,方便管理,降低維護成本,以及降低代碼冗余 函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。 2.函

python 基礎

發現 判斷 考試 去掉 list去重 王健林 第七篇 有序列表 深度拷貝 一. 補充基礎數據類型的相關知識點 str. join() 把列表變成字符串 列表不能再循環的時候刪除. 因為索引會跟著改變 字典也不能直接循環刪除.把要刪除的內容記錄在列表中. 循環列表. 刪除原

java基礎 比較運算子

比較運算子 名稱 舉例 結果 > 大於 a=5;b=2;a>b; true < 小於 a=5;b=2;a<b; false >= 大於等於 a=5;a>=3

C#程式設計基礎C#中的基本迴圈語句while迴圈、do-while迴圈、for迴圈、foreach迴圈的使用

知識點:while迴圈、do-while迴圈、forxufo迴圈、ach迴圈的使用。 1、while迴圈 特點:先判斷條件,條件為真,執行迴圈語句。條件為假,直接結束迴圈語句。 語法: while(條件表示式) {        迴圈語句;

javaweb基礎登入功能的實現

  這節課我們來做個登入功能   login.jsp: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> &nb

ORM框架SQLAlchemy

一 介紹 SQLAlchemy是Python程式語言下的一款ORM框架,該框架建立在資料庫API之上,使用關係物件對映進行資料庫操作,簡言之便是:將物件轉換成SQL,然後使用資料API執行SQL並獲取執行結果。 1、安裝 pip3 install sqlalchemy  2、架構與流程  

Hibernate基礎之十一對關聯[email protected

一:Group和Users兩個類 假定一個組裡有n多使用者,但是一個使用者只對應一個使用者組。 1.所以Group對於Users是“一對多”的關聯關係@OneToMany Users對於Group是“多對一”@ManyToOne 2.CRUD時候,希望是能從具體使用者U

數據預處理(四) - 數據歸約(PCA/EFA為例)

通過 mage 如果 解釋 最大似然法 能力 似然 模擬 ont 前言 這部分也許是數據預處理最為關鍵的一個階段。 如何對數據降維是一個很有挑戰,很有深度的話題,很多理論書本均有詳細深入的講解分析。 本文僅介紹主成分分析法(P

R語言學習 列表

方法 靈活的數據類型 引號 bounds 參考 最大的 post 長度 索引操作 列表(List)是R中最復雜的數據類型,一般來說,列表是數據對象的有序集合,但是,列表的各個元素(item)的數據類型可以不同,每個元素的長度可以不同,是R中最靈活的數據類型。列表項可以是列表

Python3連接MySQL

定義 執行 對象 delet l數據庫 hal gin sele fault 第七篇:Python3連接MySQL 連接數據庫 註意事項 在進行本文以下內容之前需要註意: 你有一個MySQL數據庫,並且已經啟動。 你有可以連接該數據庫的用戶名和密碼 你有一個有權限操作的d