Java EE 注解(二):Hibernate - JPA Annotations

這是個(gè)系列教程,看完這個(gè)世杀,你對(duì)JavaEE注解,包括spring肝集、hibernate瞻坝,RESTFul web service ,JAXB, 以及junit注解將會(huì)有一個(gè)全面的了解杏瞻。
英文原版網(wǎng)址在這里 我們不光是spring網(wǎng)站的搬運(yùn)工@農(nóng)夫山泉水所刀,實(shí)際上,翻譯過程中我保證準(zhǔn)確同時(shí)捞挥,加入了自己的理解浮创。

Hibernate JPA Annotations - Contents:

@Entity
import javax.persistence.Entity;

@Table
import javax.persistence.Table;

@Column
import javax.persistence.Column;

@Id
import javax.persistence.Id;

@GeneratedValue
import javax.persistence.GeneratedValue;

@Version
import javax.persistence.Version;

@OrderBy
import javax.persistence.OrderBy;

@Transient
import javax.persistence.Transient;

@Lob
import javax.persistence.Lob;

Hibernate Association Mapping Annotations

@OneToOne
import javax.persistence.OneToOne;

@ManyToOne
import javax.persistence.ManyToOne;

@OneToMany
import javax.persistence.OneToMany;

@ManyToMany
import javax.persistence.ManyToMany;

@PrimaryKeyJoinColumn
import javax.persistence.PrimaryKeyJoinColumn;

@JoinColumn
import javax.persistence.JoinColumn;

@JoinTable
import javax.persistence.JoinTable;

@MapsId
import javax.persistence.MapsId;

Hibernate Inheritance Mapping Annotations

@Inheritance
import javax.persistence.Inheritance;

@DiscriminatorColumn
import javax.persistence.DiscriminatorColumn;

@DiscriminatorValue
import javax.persistence.DiscriminatorValue;

@Entity,@Table,@Colume,@Id,@GeneratedValue略

@OrderBy(用于One-to-Many等關(guān)聯(lián)表中集合的排序)

@OrderBy("firstName asc")
private Set contacts;

@Transient 字段不會(huì)更新到數(shù)據(jù)庫

@Lob:二進(jìn)制數(shù)據(jù)

hibernate的注解就這么完了嗎?

Paste_Image.png

hibernate注解的<u>重難點(diǎn)</u>在于多表之間的關(guān)系:

栗子來了:

Paste_Image.png

company - companydetail : one-to-one砌函,共享相同主鍵
contact - contactDetail : 通過外鍵連接的one-to-one
contact-company : 外鍵連接的many-to-one, contact作為owner
company-companyStatus : 外鍵連接的many-to-one斩披,company作為owner

one-to-one tips:

共享相同主鍵的用@PrimaryKeyJoinColumn
一方持有另一方外鍵,用 @JoinColumn & @OneToOne和 mappedBy屬性
兩個(gè)Entity通過一個(gè)中間表聯(lián)系讹俊,使用@JoinTable and mappedBy
共享鍵用@MapsId

one-to-one

@Entity
@Table(name = "company")
public class Company implements Serializable {
   
  @Id
  @Column(name = "id")
  @GeneratedValue
  private int id;
   
  @OneToOne(cascade = CascadeType.MERGE)
  @PrimaryKeyJoinColumn
  private CompanyDetail companyDetail;
   
  ...
}
 
@Entity
@Table(name = "companyDetail")
public class CompanyDetail implements Serializable {
 
  @Id
  @Column(name = "id")
  private int id;
   
  ...
}



@Entity
@Table(name = "contactDetail")
public class ContactDetail implements Serializable {
 
  @Id
  @Column(name = "id")
  @GeneratedValue
  private int id;
   
  @OneToOne
  @MapsId
  @JoinColumn(name = "contactId")
  private Contact contact;
   
  ...
}
 
@Entity
@Table(name = "contact")
public class Contact implements Serializable {
 
  @Id
  @Column(name = "ID")
  @GeneratedValue
  private Integer id;
 
  @OneToOne(mappedBy = "contact", cascade = CascadeType.ALL)
  private ContactDetail contactDetail;
 
  ....
}

cascade(級(jí)聯(lián))級(jí)聯(lián)在編寫觸發(fā)器時(shí)經(jīng)常用到垦沉,觸發(fā)器的作用是當(dāng) 主控表信息改變時(shí),用來保證其關(guān)聯(lián)表中數(shù)據(jù)同步更新仍劈。若對(duì)觸發(fā)器來修改或刪除關(guān)聯(lián)表相記錄厕倍,必須要?jiǎng)h除對(duì)應(yīng)的關(guān)聯(lián)表信息,否則贩疙,會(huì)存有臟數(shù)據(jù)讹弯。所以,適當(dāng)?shù)淖龇ㄊ钦饨Γ瑒h除主表的同時(shí)组民,關(guān)聯(lián)表的信息也要同時(shí)刪除,在hibernate中芍躏,只需設(shè)置cascade屬性值即可邪乍。

CascadeType.PERSIST:級(jí)聯(lián)新增(又稱級(jí)聯(lián)保存):對(duì)order對(duì)象保存時(shí)也對(duì)items里的對(duì)象也會(huì)保存。對(duì)應(yīng)EntityManager的presist方法

例子:只有A類新增時(shí),會(huì)級(jí)聯(lián)B對(duì)象新增庇楞。若B對(duì)象在數(shù)據(jù)庫存(跟新)在則拋異常(讓B變?yōu)槌志脩B(tài))

CascadeType.MERGE:級(jí)聯(lián)合并(級(jí)聯(lián)更新):若items屬性修改了那么order對(duì)象保存時(shí)同時(shí)修改items里的對(duì)象榜配。對(duì)應(yīng)EntityManager的merge方法

例子:指A類新增或者變化,會(huì)級(jí)聯(lián)B對(duì)象(新增或者變化)

CascadeType.REMOVE:級(jí)聯(lián)刪除:對(duì)order對(duì)象刪除也對(duì)items里的對(duì)象也會(huì)刪除吕晌。對(duì)應(yīng)EntityManager的remove方法

例子:REMOVE只有A類刪除時(shí)蛋褥,會(huì)級(jí)聯(lián)刪除B類;

CascadeType.REFRESH:級(jí)聯(lián)刷新:獲取order對(duì)象里也同時(shí)也重新獲取最新的items時(shí)的對(duì)象睛驳。對(duì)應(yīng)EntityManager的refresh(object)方法有效烙心。即會(huì)重新查詢數(shù)據(jù)庫里的最新數(shù)據(jù) (用的比較少)

CascadeType.ALL:以上四種都是

綜上所述:一般的,用CascadeType.MERGE:級(jí)聯(lián)合并(級(jí)聯(lián)更新)就能達(dá)到級(jí)更新同時(shí)又穩(wěn)定不報(bào)錯(cuò)乏沸。

@ManyToOne

tips:
Use @JoinColumn when foreign key is held by one of the entities.
Use @JoinTable for entities linked through an association table.

@Entity
@Table(name = "contact")
public class Contact implements Serializable {
 
  @ManyToOne
  @JoinColumn(name = "companyId")
  private Company company;
   
  ...
   
 }
 
@Entity
@Table(name = "company")
public class Company implements Serializable {
 
  @ManyToOne
  @JoinColumn(name = "statusId")
  private CompanyStatus status;
   
  ...
   
 }

@OneToMany

tips:
Use mappedBy attribute for bi-directional associations with ManyToOne being the owner.
OneToMany being the owner or unidirectional with foreign key - try to avoid such associations but can be achieved with @JoinColumn
@JoinTable for Unidirectional with association table

//Please see the many-to-one relationship between Contact and Company above. Company to Contact will be a one-to-many relationship. The owner of this relationship is Contact and hence we will use 'mappedBy' attribute in Company to make it bi-directional relationship.
@Entity
@Table(name = "company")
public class Company implements Serializable {
 
  @OneToMany(mappedBy = "company", fetch = FetchType.EAGER)
  @OrderBy("firstName asc")
  private Set contacts;
     
  ...
   
 }

@ManyToMany

tips:
Use @JoinTable for entities linked through an association table.
Use mappedBy attribute for bi-directional association.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淫茵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹬跃,更是在濱河造成了極大的恐慌匙瘪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝶缀,死亡現(xiàn)場離奇詭異丹喻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翁都,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門碍论,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柄慰,你說我怎么就攤上這事鳍悠。” “怎么了先煎?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵贼涩,是天一觀的道長巧涧。 經(jīng)常有香客問我薯蝎,道長,這世上最難降的妖魔是什么谤绳? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任占锯,我火速辦了婚禮,結(jié)果婚禮上缩筛,老公的妹妹穿的比我還像新娘消略。我一直安慰自己,他們只是感情好瞎抛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布艺演。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胎撤。 梳的紋絲不亂的頭發(fā)上晓殊,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音伤提,去河邊找鬼巫俺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肿男,可吹牛的內(nèi)容都是我干的介汹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舶沛,長吁一口氣:“原來是場噩夢啊……” “哼嘹承!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起如庭,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赶撰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柱彻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豪娜,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年哟楷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘤载。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卖擅,死狀恐怖鸣奔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惩阶,我是刑警寧澤挎狸,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站断楷,受9級(jí)特大地震影響锨匆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冬筒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一恐锣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舞痰,春花似錦土榴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赫段。三九已至,卻和暖如春矢赁,著一層夾襖步出監(jiān)牢的瞬間瑞佩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工坯台, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炬丸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓蜒蕾,卻偏偏與公主長得像稠炬,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咪啡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容