JPA中@JoinColumn的name和referencedColumnName屬性的區(qū)別及說明
一、@JoinColumn
@JoinColumn 的作用就是聲明關聯(lián)關系的,什么是關聯(lián)關系?
就是我們在數(shù)據庫設計時常說的一對多、多對一、多對多關系。
因此,@JoinColumn 必須和這些關系注解一起使用,否則是沒有意義的。
二、name 和 referencedColumnName
剛開始接觸這兩個屬性會覺得很難理解,特別是看書的時候總是分不清,看下面的例子:
// Address表對應的Entity Class Address{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ... } // User表對應的Entity Class User{ ... // 顯然下面這個屬性表示每個User對應一個Address,思考一下: // 平時我們在設計數(shù)據庫的時候會怎么處理這種關系?我一般對這 // 一對一的關系,都會直接在User表中添加一個字段指向Address // 的主鍵,而下面注解確實是這樣做的。 @OneToOne @JoinColumn(name = "address", referencedColumnName = "id") private Address address; ... }
其實這兩個屬性指向的都是數(shù)據庫字段,也就是數(shù)據庫里面真真實實存在的表的字段,而不是我們在Java程序中的成員變量名。
如上面的代碼,它表示在User表中添加一個address字段,這個字段的取值就是 Address 表的 id,也就是主鍵,也就說明了它通過這個字段關聯(lián)著兩張表,這其實就是我們在學習數(shù)據庫時處理一對一關系的一種方法,是不是很熟悉?
所以,一定記住,兩個屬性都是指數(shù)據庫里的字段?。。?!
name
:當前表的字段referencedColumnName
:引用表對應的字段,如果不注明,默認就是引用表的主鍵
實際上數(shù)據庫中的表結構如下, User 的 address 字段關聯(lián)著 Address 的 id 字段:
User 表屬性 | 語義 |
---|---|
id | ID |
address | 地址主鍵 |
… | 其他屬性 |
Address 表屬性 | 語義 |
---|---|
id | ID |
… | 其他屬性 |
看了上面的表是不是就很清楚了?
很多網上的解釋說 name 指的是外鍵名、實體字段名,其實都不是很準確,容易混淆,還是要動手做一下。
了解了JoinColumn 不妨進一步了解下 @JoinTable 的 JoinColumn 屬性,這個也是比較容易混淆的。
三、@JoinTable 的 JoinColumn 屬性
@JoinTable 一般和 @ManyToMany 使用,處理多對多關系,需要兩個 Entity 有中間關系表。
“一對多”一般不會使用關系表,而選擇將“一”直接作為“多”的一個屬性。
這也是我們學數(shù)據庫時聽老師講的常用方法。
JoinTable 有很多屬性,但我們了解基本的 JoinColumn 相關屬性即可,和我們上面說的一樣,JoinColumn 實際上指的是數(shù)據庫的字段
下面從 《Spring Data JPA 從入門到精通》截取的示例:
@Entity public class Blog{ @ManyToMany @JoinTable(name="blog_tag_relation", joinColumns=@joinColumn(name="blog_id",referencedColumnName="id"), inverseJoinColumn=@joinColumn(name="tag_id",referencedColumnName="id")) private List<Tag> tags = new ArrayList<Tag>(); }
看起來好長,但實際上只用到 @JoinTable 只有三個屬性:
name
:數(shù)據庫里的中間關系表名(blog_tag_relation)joinColumns
:當前表在關系表的鏈接字段(blog_id),一般我們會用 idinverseJoinColumn
:另一張表在關系表的鏈接字段(tag_id),一般我們會用 id
注意到我們使用 @JoinColumn 指定中間表的列,一定記住它使用的是數(shù)據庫字段。
對應的表結構如下:
Blog 表屬性 | 語義 |
---|---|
id | ID |
… | 其他屬性 |
Tag 表屬性 | 語義 |
---|---|
id | ID |
… | 其他屬性 |
blog_tag_relation 表屬性 | 語義 |
---|---|
blog_id | Blog 的 ID |
tag_id | Tag 的 ID |
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring + Spring Boot + MyBatis + MongoDB的整合教程
這篇文章主要給大家介紹了關于Spring + Spring Boot + MyBatis + MongoDB的整合教程,文中通過圖文以及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-12-12IDEA使用jformdesigner插件做管理系統(tǒng)MVC架構的步驟和實現(xiàn)思路
在?IntelliJ?IDEA?中結合?JFormDesigner?插件,通過?Swing?框架實現(xiàn)一個管理系統(tǒng)的?MVC?架構是一種經典的開發(fā)方式,以下是具體的步驟和實現(xiàn)思路,包含從項目創(chuàng)建到?MVC?架構的核心代碼實現(xiàn),需要的朋友可以參考下2024-12-12