
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" |
fetch | join(急切左外連接)、select(延遲/預設)、subselect、batch |
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 不會發出。
fetch="select"**,配合延遲載入,避免不必要的 JOIN。FETCH JOIN 或 Criteria setFetchMode 覆寫為急切載入。cascade 謹慎設定:save-update 通常足夠,all 包含 delete 可能導致誤刪關聯端資料。room_id 建議加上索引,提升關聯查詢效能。