顧名思義,@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。