1. 程式人生 > >SSH框架之Hibernate的關聯對映之一對多、多對一對映

SSH框架之Hibernate的關聯對映之一對多、多對一對映

關聯對映之一對多、多對一對映

一、需求:
部門與員工
一個部門有多個員工 【一對多】
多個員工,屬於一個部門 【多對一】

二、邏輯分析:

三、程式碼實現
1、javabean及對映檔案的配置:
1)Employee.java、Employee.hbm.xml

2)Dept.java、Dept.hbm.xml

完整的Dept.hbm.xml配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="sram.oneTomany" auto-import="true"> <class name="Dept" table="t_dept"> <id name="deptId"> <generator class="native"></generator> </id> <property name="deptName" length="20"></property
>
<!-- 一對多關聯對映的配置(通過部門管理員工) Dept 對映關鍵點: 1. 指定 對映的集合屬性: "emps" 2. 集合屬性對應的集合表: "t_employee" 3. 集合表的外來鍵欄位 "t_employee. dept_id" 4. 集合元素的型別 table="t_employee"可以省略, 因為有對應的<one-to-many class="Employee"/>, 並且可以找到Employee.hbm.xml 如果寫上,那麼talbe的值"t_employee"一定要與 Employee.hbm.xml(<class name="Employee" table="t_employee">)中的表名一致 -->
<set name="emps" table="t_employee"> <!-- colunmn的值(dept_id),一定要與Employee.hbm.xml中的 <many-to-one name="dept" column="dept_id" class="Dept"></many-to-one> 的colunm值一致 --> <key column="dept_id"></key> <!-- class指定集合元素型別,sram.oneTomany.Employee, 但是因為<hibernate-mapping package="sram.oneTomany" auto-import="true"> 這裡已經指定包名,所以只寫Employee就OK --> <one-to-many class="Employee"/> </set> </class> </hibernate-mapping>

2、測試類App1_save.java——實現儲存的功能

package sram.oneToMany;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App1_save {
    public static SessionFactory sf;
    static{
        sf = new Configuration()
            .configure()
            .addClass(Dept.class)
            .addClass(Employee.class)//測試使用
            .buildSessionFactory();

1)部門方(一的一方操作)

2)【推薦】員工方(多的一方操作)

3、資料庫結果:
1)員工表:

2)部門表:

4、測試類App2_get.java——實現儲存的功能

package sram.oneToMany;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App1_save {
    public static SessionFactory sf;
    static{
        sf = new Configuration()
            .configure()
            .addClass(Dept.class)
            .addClass(Employee.class)//測試使用
            .buildSessionFactory();

1)通過部門方獲取另一方:

2)通過員工方獲取另一方:

四、總結:
1、在一對多與多對一的關聯關係中,儲存資料最好通過多的一方來維護關係,這樣可以減少update語句的生成,從而提高hibernate的執行效率!

2、概念:
配置一對多與多對一,這種叫“雙向關聯”
只配置一對多,叫“單向一對多”
只配置多對一,叫“單向多對一”

3、注意:配置了哪一方,哪一方才有維護關聯關係的許可權!