# 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欄位")}對方表 )