快速學習Spring Data JPA -- 第五章JPA多表關聯關係(不建議參考)
xl_echo編輯整理,交流學習請加1280023003 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!
關聯關係註解包括@JoinColumn、@OneToOne、@OneToMany、
@ManyToOne、@ManyToMany、@JoinTable、@OrderBy。
@JoinColumn定義外來鍵關聯的欄位名稱。@JoinColumn主要配合@OneToOne、@ManyToOne、@OneToMany一起使用,單獨使用沒有意義。
當我們使用這些註解的時候,不難發現一個問題,就是關聯的資料會被一起載入,在部分時候會造成效能問題。當然,我們的JPA對於這一塊也是做了比較好的處理,那就是JPA的執行模式:延遲載入。
fetch
這是我們以上幾個關聯關係都擁有的一個屬性,它有一下策略:
- FetchType.EAGER:直接載入
- FetchType.LAZY:懶載入
這一個是以上幾個註解的操作許可權
cascade
CascadeType.PERSIST級聯新增(又稱級聯儲存);
CascadeType.MERGE:級聯合並(級聯更新);
CascadeType.REMOVE:級聯刪除;
CascadeType.REFRESH:級聯重新整理
CascadeType.ALL:以上四種都是(請謹慎使用)
@OneToOne表示一對一
oneToone一般配置joincolumn使用
//referencedColumnName:參考列名,預設的情況下是列表的主鍵
//nullable=是否可以為空,
//insertable:是否可以插入,
//updatable:是否可以更新
//columnDefinition=列定義,
//foreignKey=外來鍵
@JoinColumn(name="pet_id",referencedColumnName="id",nullable=false)
private User user;
如果我們設定急載入的時候我們可以在程式中看到,當我們載入這個類的時候,另外關聯的類也會被加載出來
@ManyToOne表示多對一
說明: 一個客戶對應多個地址,通過客戶可以獲得該客戶的多個地址的資訊。客戶和地址是一對多的關係,並且客戶與地址是單向關聯的關係。
@Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id;
@OneToMany(casade={CascadeTypeType.ALL})
@JoinColumn(name="customer_id")
public Collection<AddressEO> getAddress() {
return address;
}
....
}
@ManyToMany表示多對多
//TODO
關於關係查詢的一些坑
(1)所有的註解要麼全配置在欄位上,要麼全配置在get方法
上,不能混用,混用就會啟動不起來,但是語法配置沒有問題。
(2)所有的關聯都是支援單向關聯和雙向關聯的,視具體業務
場景而定。JSON序列化的時候使用雙向註解會產生死迴圈,需要人為
手動轉化一次,或者使用@JsonIgnore。
(3)在所有的關聯查詢中,表一般是不需要建立外來鍵索引的。
@mappedBy的使用需要注意。
(4)級聯刪除比較危險,建議考慮清楚,或者完全掌握。
(5)不同的關聯關係的配置,@JoinClumn裡面的name、
referencedColumnName代表的意思是不一樣的,很容易弄混,可以根
據打印出來的SQL做調整。
(6)當配置這些關聯關係的時候建議大家直接在表上面,把外
鍵建好,然後通過後面我們介紹的開發工具直接生成,這樣可以減少
自己除錯的時間。