SSH框架之Hibernate的關聯對映之一對多、多對一對映
阿新 • • 發佈:2019-01-26
關聯對映之一對多、多對一對映
一、需求:
部門與員工
一個部門有多個員工 【一對多】
多個員工,屬於一個部門 【多對一】
二、邏輯分析:
三、程式碼實現
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、注意:配置了哪一方,哪一方才有維護關聯關係的許可權!