【JAVA】JPA之@OneToMany、@ManyToOne、@JoinColumn
顧名思義,@OneToMany、@ManyToOne這兩個註解就是處理一對多,多對一的關係
這兩個註解是成雙成對的,有了@OneToMany,一定會配置一個@ManyToOne
OneToMany設定
設定OneToMany的具體方法如下:
@Entity public class OrderEntity { @Id //... private String id; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parent") private List<ListEntity> list = newArrayList<ListEntity>(); }
具體說明:
cascade級聯操作
CascadeType.PERSIST級聯持久化 ( 儲存 ) 操作
CascadeType.MERGE級聯更新 (合併 )操作
CascadeType.REFRESH級聯重新整理操作,只會查詢獲取操作
CascadeType.REMOVE級聯刪除操作
CascadeType.ALL級聯以上全部操作
fetch載入型別,預設情況一的方為立即載入,多的一方為延遲載入
FetchType.LAZY 懶載入
FetchType.EAGER 立即載入(預設值)
mappedBy 關係維護
mappedBy= "parent" 表示在ListEntity類中的 parent 屬性來維護關係,這個名稱必須和ListEntity中的parent屬性名稱完全一致才行
OneToMany必須寫mappedBy,不然會多生成一張沒用的中間表,因為如果沒寫mappedBy,JPA不知道具體怎樣做關聯
ManyToOne設定
設定ManyToOne的具體方法如下:
@Entity public class ListEntity { @Id // ... private String id; @ManyToOne(fetch= FetchType.LAZY) @JoinColumn(name = "order_id", insertable = false, updatable = false) private OrderEntity parent; @Column(name = "order_id") private String orderId; }
具體說明:
fetch=FetchType.LAZY的意思是select的時候懶載入,當載入ListEntity這個物件的時候,會載入他的屬性,如id, name,但是不會去載入parent的屬性。如果是EAGER,
不僅會載入id,name等屬性,而且會載入parent裡面的屬性。
@JoinColumn與@Column標記一樣,是用於註釋表中的欄位的。它的屬性與@Column屬性有很多相同之處,例如name屬性是用來標識表中所對應的欄位的名
稱,其它的不再詳述。
@JoinColumn與@Column相區別的是:@JoinColumn註釋的是儲存表與表之間關係的欄位,它要標註在實體屬性上(相當於外來鍵)。而@Column標註的是表
中不包含表關係的欄位。
在這裡,@JoinColumn指的是ListEntity(多)表對應OrderEntity(一)表關聯欄位的名稱。即ListEntity中的orderId對應OrderEntity中的主鍵Id。