1. @OneToMany
@OneToMany
是屬性或方法級別的註解,用於定義源實體與目標實體是一對多的關係。html
參數 | 類型 | 描述 |
---|---|---|
targetEntity | Class | 源實體關聯的目標實體類型,默認是該成員屬性對應的集合類型的泛型的參數化類型。 |
mappedBy | String | 用在雙向關聯中。若是關係是雙向的,則需定義此參數(與 @JoinColumn 互斥,若是標註了 @JoinColumn 註解,不須要再定義此參數)。 |
cascade | CascadeType[] | 定義源實體和關聯的目標實體間的級聯關係。當對源實體進行操做時,是否對關聯的目標實體也作相同的操做。默認沒有級聯操做。該參數的可選值有: CascadeType.PERSIST(級聯新建) CascadeType.REMOVE(級聯刪除) CascadeType.REFRESH(級聯刷新) CascadeType.MERGE(級聯更新) CascadeType.ALL(包含以上四項) |
fetch | FetchType | 定義關聯的目標實體的數據的加載方式。 可選值: FetchType.LAZY(延遲加載,默認) FetchType.EAGER(當即加載) 延遲加載:只有在第一次訪問源實體關聯的目標實體的時候纔去加載。 當即加載:在加載源實體數據的時候同時去加載好關聯的目標實體的數據。 |
orphanRemoval | boolean | 當源實體關聯的目標實體被斷開(如給該屬性賦予另一個實例,或該屬性的值被設爲 null。被斷開的實例稱爲孤值,由於已經找不到任何一個實例與之發生關聯)時,是否自動刪除斷開的實例(在數據庫中表現爲刪除表示該實例的行記錄),默認爲 false。 可參考:orphanRemoval 與 CascadeType.REMOVE 的區別 |
1.1 一對多外鍵關聯
|
|
|
|
產生的 DDL 語句(MySQL):java
|
|
Hibernate @OneToMany
默認會產生一張中間表,如上例的 user_addresses
表。爲了不這種狀況,你能夠在一的一方使用 @JoinColumn 註解:git
|
|
產生的 DDL 語句(MySQL):github
|
|
這樣一來,多的一方經過外鍵直接與一的一方發生關聯,不須要中間表。sql
2. @ManyToOne
@ManyToOne
是屬性或方法級別的註解,用於定義源實體與目標實體是多對一的關係。數據庫
參數 | 類型 | 描述 |
---|---|---|
targetEntity | Class | 源實體關聯的目標實體類型,默認是該成員屬性對應的類型,所以該參數一般能夠缺省。 |
cascade | CascadeType[] | 定義源實體和關聯的目標實體間的級聯關係。當對源實體進行操做時,是否對關聯的目標實體也作相同的操做。默認沒有級聯操做。該參數的可選值有: CascadeType.PERSIST(級聯新建) CascadeType.REMOVE(級聯刪除) CascadeType.REFRESH(級聯刷新) CascadeType.MERGE(級聯更新) CascadeType.ALL(包含以上四項) |
fetch | FetchType | 定義關聯的目標實體的數據的加載方式。 可選值: FetchType.LAZY(延遲加載) FetchType.EAGER(當即加載,默認) 延遲加載:只有在第一次訪問源實體關聯的目標實體的時候纔去加載。 當即加載:在加載源實體數據的時候同時去加載好關聯的目標實體的數據。 |
optional | boolean | 源實體關聯的目標實體是否容許爲 null,默認爲 true。 |
2.1 多對一外鍵關聯
|
|
|
|
產生的 DDL 語句(MySQL):app
|
|
3. @OneToMany & @ManyToOne
一對多 & 多對一雙向外鍵關聯示例:post
|
|
|
|
產生的 DDL 語句(MySQL):fetch
|
|