首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 3 學習筆記(十七):多對一關聯映射核心解析

     編輯:Java 相關知識

資料表與實體設計

多對一 ER 圖

CREATE TABLE user (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL DEFAULT '',
    room_id INT(11)
);
CREATE TABLE room (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    address VARCHAR(100) NOT NULL DEFAULT ''
);

多個 User 共享一個 Room → User 端持有 Room 引用。

映射檔:<many-to-one> 詳解

<many-to-one name="room" column="room_id"
    class="com.hb3.pack_16.model.Room"
    cascade="all" outer-join="true"/>

核心屬性

屬性說明
name實體類別中的屬性名
column資料表外鍵欄位名
class關聯的目標實體類別
cascade級聯操作:all、save-update、delete、none 等
outer-join已過時,建議改用 fetch="join|select"
fetchjoin(急切左外連接)、select(延遲/預設)、subselect、batch

fetch 模式對 SQL 的影響

fetch="join"(或 outer-join="true")

SELECT user0_.id, user0_.name, user0_.room_id,
       room1_.id, room1_.address
FROM user user0_
LEFT OUTER JOIN room room1_ ON user0_.room_id = room1_.id
WHERE user0_.id = ?

單條 SQL 完成,適合「確定會用到關聯物件」的場景。

fetch="select"(或 outer-join="false",預設)

SELECT user0_.id, user0_.name, user0_.room_id FROM user user0_ WHERE user0_.id = ?
SELECT room0_.id, room0_.address FROM room room0_ WHERE room0_.id = ?

兩條 SQL,支援延遲載入。若不存取 user.getRoom(),第二條 SQL 不會發出。

最佳實踐建議

  1. **預設使用 fetch="select"**,配合延遲載入,避免不必要的 JOIN。
  2. 在明確需要關聯資料的查詢中,使用 HQL FETCH JOIN 或 Criteria setFetchMode 覆寫為急切載入。
  3. cascade 謹慎設定:save-update 通常足夠,all 包含 delete 可能導致誤刪關聯端資料。
  4. 外鍵欄位 room_id 建議加上索引,提升關聯查詢效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved