1. 程式人生 > >快速學習Spring Data JPA -- 第五章JPA多表關聯關係(不建議參考)

快速學習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)當配置這些關聯關係的時候建議大家直接在表上面,把外
鍵建好,然後通過後面我們介紹的開發工具直接生成,這樣可以減少
自己除錯的時間。