1. 程式人生 > 其它 >【JAVA】JPA之@OneToMany、@ManyToOne、@JoinColumn

【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 = new
ArrayList<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。