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