摘要:前言首先聲明,這是一篇轉發博客,不屬于原創。關系映射有下面幾種類型一對一外鍵關聯映射單向一對一外鍵關聯,使用,并設置了級聯操作。設置了外鍵的名稱為數據庫字段名,如果不設置,則默認為另一類的屬性名,外鍵的值是唯一的。
前言
首先聲明,這是一篇轉發博客,不屬于原創。但是感覺很有用,所以在本人的博客中記錄下來。
Hibernate Annotation關系映射有下面幾種類型:
一對一外鍵關聯映射(單向)java一對一外鍵關聯映射(雙向)
@OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="userid",unique=true) /* 一對一外鍵關聯,使用@OneToOne,并設置了級聯操作。@JoinColum設置了外鍵的名稱為userid(數據庫字段名),如果不設置,則默認為另一類的屬性名+ _id,外鍵的值是唯一的(unique)。*/
Class1里與上面一樣,對于Class2:
java
@OneToOne(mappedBy="class2",cascade=CascadeType.ALL)
注意:
需要加上mappedBy="class2",如果不加上的話,Class2也會生成一個外鍵(class1_id),mappedby="class2"需要指向與他關聯對象的一個屬性,說明雙向關聯關系中,有且僅有一端是作為主體(owner)端存在的,主體端負責維護聯接列,對于不需要維護這種關系的從表則通過mappedBy屬性進行聲明,mappedBy的值指向主體的關聯屬性
規律:只有是雙向關聯關系,都加上mappedby
(嵌入式對象)組件映射將另外一個類成為實體類的一部分進行映射,舉個例子,用戶的教育經歷完全依附于用戶表,但是又有比較復雜的結構,就可以使用Embedded
注意:
成為其他實體類一部門的類不要注解為@Entity 實體類!
使用@Embedded對組件類注解。
組件屬性名名為了保證不與實體類屬性名沖突,可以使用如下注解:
java
@AttributeOverrides( { @AttributeOverride(name="xx",column=@Column(name="xxx")), @AttributeOverride(name="xx2",column=@Column(name="xxx2")), } )
在嵌入式對象里,對其屬性使用@column進行設置
下面使用一個例子結合@ElementCollection來說明
java@Entity public class User { [...] public String getLastname() { ...} @ElementCollection @CollectionTable(name="Addresses", joinColumns=@JoinColumn(name="user_id")) @AttributeOverrides({ @AttributeOverride(name="street1", column=@Column(name="fld_street")) }) public Set getAddresses() { ... } } @Embeddable public class Address { public String getStreet1() {...} [...] } //注意,Embedded對象不能再含有Collection了,同時一張表是不可避免的一對多關聯映射(單向)
java一對多關聯映射(雙向)
@OneToMany @JoinColumn(name="orgid") /** * 一對多注解@OneToMany(單向) * 如果只寫@OneToMany的話,hibernate會建一張中間表來 * 維護他們之間的關系, * 加上@JoinColumn(name="orgid"),則不會建中間表,他會在 * 多的一端加上外鍵orgid,來維護他們之間的關系 */
對于一端:
java
@OneToMany(mappedBy="org") @JoinColumn(name="orgid") /** * 一對多雙向,在一的一端中設置mappedBy * 說明多的一端為主導 * 如果指定了外鍵字段名稱,則多的一端也需要指定相同的字段名稱 */
對于多端:
java多對一關聯映射
@ManyToOne @JoinColumn(name="orgid") /** * 一對多雙向 * 需要指定外鍵與一的一端給的外鍵名稱一致,@JoinColumn(name="orgid") * 也可以不指定,如果在多的一端不指定,則一的一端也不能指定 * 否則為生成兩個外鍵 */
在多的一端配置:
java多對多關聯映射(單向)
@ManyToOne(targetEntity=Organization.class) @JoinColumn(name="orgid") //多對一注解@ManyToOne //targetEntity指定了關聯對象 //@JoinColumn(name="orgid")指定生產的外鍵的字段名,默認是org_id
java多對多關聯映射(雙向)
@ManyToMany /** * 多對多映射:注解@ManyToMany(單向) * 默認情況下,hibernate會自動的創建一張中間表, * 來維護多對多關系 * 默認中間表的名稱 :user_role中間表,字段的名稱user_id role_id * 如果想更換表名和字段名稱,注解如下: */ @JoinTable(name="t_u_r", joinColumns={@JoinColumn(name="u_id")}, inverseJoinColumns={@JoinColumn(name="r_id")} )
舉個例子Role表和User表,用戶可以有多個角色,角色也可以屬于多個用戶
User端:
java
@ManyToMany /** * 多對多映射:注解@ManyToMany(單向) * 默認情況下,hibernate會自動的創建一張中間表, * 來維護多對多關系 * 默認中間表的名稱 :user_role中間表,字段的名稱user_id role_id * 如果想更換表名和字段名稱,注解如下: */ @JoinTable(name="t_u_r", joinColumns={@JoinColumn(name="u_id")}, inverseJoinColumns={@JoinColumn(name="r_id")} ) /** * @JoinTable(name="t_u_r", * 指定中間表的表名 * joinColumns={@JoinColumn(name="u_id")}, * 指定當前對象的外鍵 * inverseJoinColumns={@JoinColumn(name="r_id")} * 指定關聯對象的外鍵 */
Role端:
@ManyToMany(mappedBy="role") /** * 多對多,雙向關聯映射 */
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64395.html
摘要:前言前面的我們使用的是一個表的操作,但我們實際的開發中不可能只使用一個表的因此,本博文主要講解關聯映射集合映射需求分析當用戶購買商品,用戶可能有多個地址。數據庫表我們一般如下圖一樣設計數據庫表,一般我們不會在表設計多個列來保存地址的。 前言 前面的我們使用的是一個表的操作,但我們實際的開發中不可能只使用一個表的...因此,本博文主要講解關聯映射 集合映射 需求分析:當用戶購買商品,用戶...
摘要:使用反射機制,而不是字節碼增強程序來實現透明性。工具類初始化失敗為空,請檢查配置文件瞬時對象與持久化對象測試代碼當前在數據庫中沒有記錄進行關聯,所以此時是瞬時對象。將持久化當前在數據庫有唯一一條記錄對應,所以此時是持久化對象。 showImg(https://segmentfault.com/img/bVbo4at?w=2313&h=642); 一、什么是Hibernate? Hibe...
摘要:所以設計的表名映射格式為,如果不加注解,則將實體名按照默認的生成規則進行生成,如果加了注解,則填寫的就作為表名映射,不進行任何處理。云智命名策略實體與數據表名的關系配置然后將該項配置修改為我們自己建立的實現類。 問題描述 Hibernate映射介紹 Hibernate中,默認的生成關系是將我們駝峰命名的實體進行拼接下劃線同時轉小寫。 showImg(https://segmentfa...
摘要:在使用作為應用時推薦使用作為開發工具導入相應的的包到文件下的目錄下關于開發中導入的說明在此提供一個包下載鏈接,地址百度云盤下載好以后解壓到某個文件夾里解壓好以后,開發所需要的包在解壓后的包下,將該文件夾下的包復制到項目中另外還需 1.在使用Hibernate作為orm應用時推薦使用myeclipse作為開發工具2.導入相應的Hibernate的jar包到webroot文件下的lib目錄...
閱讀 2217·2019-08-30 15:54
閱讀 1953·2019-08-30 13:49
閱讀 674·2019-08-29 18:44
閱讀 828·2019-08-29 18:39
閱讀 1111·2019-08-29 15:40
閱讀 1533·2019-08-29 12:56
閱讀 3144·2019-08-26 11:39
閱讀 3101·2019-08-26 11:37