---
# System prepended metadata

title: Object Relation
tags: [Java, JPA, Spring]

---

# Object Relation
###### tags: `JPA` `Spring` `Java` 
單向多對一 ( n-1
客戶(1)
訂單(n) 保存客戶主鍵
使用@ManyToOne來對應多對一關聯關係
使用@JoinColumn來對應外鍵

保存多對一時建議先存一方，若先保存多方則會額外多發更新。
默認情況為左外連接方式來join 1方，當使用懶加載時則不會join。

單向一對多 ( 1-n
客戶(n) 保存訂單集合
訂單(1) 
使用@OneToMany來對應一對多關聯關係
使用@JoinColumn來對應外鍵
單向一對多保存時一定會多出Update因為n方在插入時不會同時插入外鍵
查詢時預設懶加載
預設刪除一方時先把多方外鍵設為null，可透過cascade來調整策略

雙向多對一 ( n-1
等同於 單向多對一 + 單向一對多
需要注意的是兩邊的外鍵名稱要一致

執行保存時建議先存一方，若先保存多方則會額外多發更新。
維護關聯關係建議由n方而1方不維護這樣會有效的減少sql具體實現=>
在一方的@OneToMany(mappedBy="多方保存一方的變數名") 
當使用了mappedBy則不能使用@JoinColumn

雙向一對一
維護關聯關係的一方有外鍵並且用@OneToOne , @JoinColumn(name="",unique=true) 設定
沒有外鍵的一方不維護關聯關係使用@OneToOne的mappedBy屬性標記對方關聯欄位


雙向多對多
其中一方必定要放棄維護關聯@ManyToMany(mappedBy="")
維護方需要
@JoinTable(
name="",//中間表名稱
joinColumns={@JoinColumn(name="中間表欄位名稱",referencedColumn="目前表ID欄位")},//目前表
inverseJoinColumns={@JoinColumn(name="中間表欄位名稱",referencedColumn="對方表ID欄位")}對方表
)