學習Spring-Data-Jpa(三)---關聯關系常用注解


1、@JoinColumn: 用於指定 連接實體關聯或元素集合的列。
屬性 name:
外鍵列的名稱,它所在的表取決於上下文。
如果連接是使用外鍵映射策略的一對一或多對一映射,則外鍵列位於源實體或可嵌入的表中。
如果連接用於使用外鍵映射策略的單向一對多映射,則外鍵位於目標實體的表中。
如果聯接是針對多對多映射,或者是針對使用聯接表的一對一或雙向多對一/多對多映射,則外鍵在聯接表中。

如果聯接是元素集合的聯接,則外鍵在集合表中。

默認值(僅在使用單個連接列時適用): 引用實體屬性或字段名稱 + "_" + 引用的主鍵名稱。

屬性 referencedColumnName:
這個外鍵列引用的列的名稱。
當與這里描述的情況之外的實體關系映射一起使用時,所引用的列位於目標實體的表中。
當與單向OneToMany外鍵映射一起使用時,所引用的列位於源實體的表中。
當在一個@JoinTable中使用時,被引用的鍵列位於所屬實體的實體表中,或者如果連接是逆連接定義的一部分,則在逆實體中使用。

在CollectionTable映射中使用時,引用的列位於包含集合的實體的表中。

默認值(僅在使用單個聯接列時適用):與引用表的主鍵列相同的名稱。

屬性 unique : 是否唯一,默認false。
屬性 nullable:能否為null,默認true。
屬性 insertable:是否跟隨一起新增,默認true。
屬性 updatable:是否跟隨一起修改,默認true。
屬性 columnDefinition:DDL sql片段。
屬性 table :
包含該列的表的名稱。如果沒有指定表,則假定列在適用實體的主表中。
默認值:
如果聯接是使用外鍵映射策略的一對一或多對一映射,則為源實體或可嵌入表的名稱。
如果聯接用於使用外鍵映射策略的單向OneToMany映射,則為目標實體的表名。
如果聯接是針對多對多映射,或者是針對使用聯接表的一對一或雙向多對一/多對多映射,則聯接表的名稱。
如果聯接是元素集合,則為集合表的名稱。

屬性 foreignKey:於在表生成時指定或控制外鍵約束的生成。如果未指定此元素,則將應用持久性提供程序的默認外鍵策略。一般默認即可。



2、@JoinColumns 指定組合外鍵的映射。該注釋對相同關系的JoinColumn注釋進行分組。
使用JoinColumns注釋時,必須在每個這樣的JoinColumn注釋中指定name和referencedColumnName元素。


3、@JoinTable 指定關聯的映射。用於關聯的擁有方。
通常用於many-to-many和單向one-to-many關聯的映射。
還可以用於雙向many-to-one/one-to-many,單向many-to-one,雙向或單向one-to-one。
如果沒有@JoinTable注解,則使用注解元素默認值,連接表的名稱為使用下划線連接在一起的關聯主表的表名(首先是擁有方)。
屬性 name:連接表名稱,默認為兩個關聯的主實體表的連接名稱,用下划線分隔。
屬性 catalog:表的目錄。默認為默認目錄。一般默認即可。
屬性 schema:表的schema。默認為用戶的默認schema。一般默認即可。
屬性 joinColumns:連接表的外鍵列,它引用擁有關聯的實體的主表。
屬性 inverseJoinColumns:連接表的外鍵列,它引用不擁有關聯的實體的主表。(即相反的一面)。
屬性 foreignKey:用於在表生成時為joinColumns元素對應的列指定或控制外鍵約束的生成。一般默認即可。
屬性 inverseForeignKey:於指定或控制在表生成時對應於inverseJoinColumns元素的列的外鍵約束的生成。一般默認即可。
屬性 uniqueConstraints:要放在表上的唯一約束。只有在表生成時才使用這些方法。默認沒有附加約束。一般默認即可。
屬性 indexes:表的索引。只有在表生成時才使用這些方法。一般默認即可。


4、@OneToOne 指定與具有一對一多重性的另一個實體的單值關聯。
通常不需要顯式地指定關聯的目標實體,因為通常可以從引用的對象類型推斷出它。
如果關系是雙向的,非擁有方必須使用OneToOne注釋的mappedBy元素來指定擁有方的關系字段或屬性。

屬性 targetEntity :關聯的目標實體類。默認字段或屬性的類型。
屬性 cascade:級聯操作策略。默認情況下沒有級聯操作。
屬性 fetch:數據獲取方式,默認EAGER,立即獲取。
屬性 optional:是否允許為空,默認true。
屬性 mappedBy:擁有關系的字段。此元素僅在關聯的反(非擁有)端指定。關聯關系被誰維護。
mappedBy不能與@JoinColumn、@JoinTable同時使用。
mappedBy指的是另一方實體屬性的名稱
屬性 orphanRemoval:是否級聯刪除,和CascadeType.REMOVE效果一樣,只要配置其中一種就會級聯刪除。默認false。

@OneToOne 配合@JoinColumn 一起使用,可以單項關聯也可以雙向關聯,是具體情況而定。雙向一對一決定哪一方來管理外鍵,通常使用常用的一方來管理。


5、@OneToMany 指定一個具有一對多多重性的多值關聯。
如果使用泛型定義集合以指定元素類型,則不需要指定關聯的目標實體類型;否則,必須指定目標實體類。
如果關系是雙向的,則必須使用mappedBy元素指定關系的所有者實體的關系字段或屬性。
屬性 targetEntity:關聯的目標實體類。只有使用java泛型定義集合時,才是可選的。否則必須指定。使用泛型定義時,默認為集合的參數化類型。
屬性 cascade:級聯操作策略。默認情況下沒有級聯操作。
屬性 fetch:數據獲取方式,默認LAZY,延遲加載。(與一對一、多對一不同)
屬性 mappedBy:擁有關系的字段。除非關系是單向的,否則是必需的。
屬性 orphanRemoval:是否級聯刪除,和CascadeType.REMOVE效果一樣,只要配置其中一種就會級聯刪除。默認false。
指定集合中的一個元素中集合中移除,是否從數據庫中刪除。

注意:@OneToMany單獨使用建立單項一對多關系時,如果不配合@JoinColumn使用,會額外產生一張表來維護關聯關系。配合@JoinColumn使用時,外鍵會生成在目標表中。


6、@ManyToOne 指定與另一個具有多對一多重性的實體類的單值關聯。
通常不需要顯式地指定目標實體,因為它通常可以從引用的對象類型推斷出來。
如果關系是雙向的,非所有者 OneToMany實體端必須使用mappedBy元素來指定關系的所有者實體的關系字段或屬性。
屬性 targetEntity:關聯的目標實體類。默認字段或屬性的類型。
屬性 cascade:級聯操作策略。默認情況下沒有級聯操作。
屬性 fetch:數據獲取方式,默認EAGER,立即獲取。(與一對多不同)
屬性 optional:是否允許為空,默認true。


7、@OrderBy 指定關聯查詢時的排序,一般和@OneToMany一起使用。
要排序的字段格式如下
orderby_list::= orderby_item [,orderby_item]*
orderby_item::= [property_or_field_name] [ASC | DESC]

如果沒有指定升序還是降序,默認使用升序。
如果沒有指定實體排序的元素,默認使用主鍵。
排序字段必須的對應的關聯實體中的屬性對應,必須支持比較運算。
可以用.來引用嵌入屬性中的字段。


8、@ManyToMany 指定具有多對多多重性的多值關聯。
每個多對多關聯都有兩個方面,擁有方和非擁有方,或反向方。聯接表是在所屬方指定的。
如果關聯是雙向的,任何一方都可以被指定為擁有方。非擁有方必須使用ManyToMany注釋的mappedBy元素來指定擁有方的關系字段或屬性。
屬性 targetEntity:關聯的目標實體類。只有使用java泛型定義集合時,才是可選的。否則必須指定。使用泛型定義時,默認為集合的參數化類型。
屬性 cascade:級聯操作策略。默認情況下沒有級聯操作。
屬性 fetch:數據獲取方式,默認LAZY,延遲加載。
屬性 mappedBy:擁有關系的字段。除非關系是單向的,否則是必需的。

@ManyToMany一般和@JoinTable一起使用。
@ManyToMany 也可拆分成兩個多對一關系。

源碼地址:https://github.com/caofanqi/study-spring-data-jpa


免責聲明!

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



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