JPA定義了one-to-one、one-to-many、many-to-one、many-to-many 4種關系。
對于數據庫來說,通常在一個表中記錄對另一個表的外鍵關聯;對應到實體對象,持有關聯數據的一方稱為owning-side,另一方稱為inverse-side。
為了編程的方便,我們經常會希望在inverse-side也能引用到owning-side的對象,此時就構建了雙向關聯關系。 在雙向關聯中,需要在inverse-side定義mappedBy屬性,以指明在owning-side是哪一個屬性持有的關聯數據。
對關聯關系映射的要點如下:
關系類型 | Owning-Side | Inverse-Side |
---|
one-to-one | @OneToOne | @OneToOne(mappedBy="othersideName") |
one-to-many / many-to-one | @ManyToOne | @OneToMany(mappedBy="xxx") |
many-to-many | @ManyToMany | @ManyToMany(mappedBy ="xxx") |
其中 many-to-many關系的owning-side可以使用@JoinTable聲明自定義關聯表,比如Book和Author之間的關聯表:
@JoinTable(name = "BOOKAUTHOR", joinColumns = { @JoinColumn(name = "BOOKID", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "AUTHORID", referencedColumnName = "id") })
關聯關系還可以定制延遲加載和級聯操作的行為(owning-side和inverse-side可以分別設置):
通過設置fetch=FetchType.LAZY 或 fetch=FetchType.EAGER來決定關聯對象是延遲加載或立即加載。
通過設置cascade={options}可以設置級聯操作的行為,其中options可以是以下組合:
- CascadeType.MERGE 級聯更新
- CascadeType.PERSIST 級聯保存
- CascadeType.REFRESH 級聯刷新
- CascadeType.REMOVE 級聯刪除
- CascadeType.ALL 級聯上述4種操作