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對應OrderList中的主鍵Id。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM