使用注解的目的是簡(jiǎn)化繁瑣的ORM映射文件(.hbm)的配置
JPA全稱是java? Persistence API(java持久化接口)
JPA注解是JAVAEE的規(guī)范和標(biāo)準(zhǔn)? JPA是標(biāo)準(zhǔn)接口卢厂,Hibernate是實(shí)現(xiàn),通過hibernate-annitation,hibernate-entityManager,hibernate-code組件來實(shí)現(xiàn)
一:類級(jí)別注解
@Entity:映射實(shí)體類
@Entity(name = "tableName")
?? name:可選霉囚,對(duì)應(yīng)數(shù)據(jù)庫中的一個(gè)表救巷。若表名與實(shí)體類名相同丙猬,則可以省略
使用@Entity時(shí)必須指定實(shí)體類的主鍵屬性(通過在某個(gè)屬性的getter方法上加@Id實(shí)現(xiàn))
@Table(name = "" , catalog = "" , schema = "")
與@Entity配合使用樱哼,只能標(biāo)注在實(shí)體的class定義處趁冈,表示實(shí)體對(duì)應(yīng)的數(shù)據(jù)庫表的信息
mysql5.7支持catalog但是是不支持schema的
name:可選悔捶,映射表的名稱皂岔,默認(rèn)表名和實(shí)體名稱一致蹋笼,只有在不一致的情況下才需要指定表名
catalog:可選,表示Catalog名稱躁垛,
schema:可選姓建,表示Schema名稱(相當(dāng)于數(shù)據(jù)庫名(但這樣又不會(huì)去創(chuàng)建一個(gè)新的數(shù)據(jù)庫))(在創(chuàng)建表時(shí),sql語句表名前會(huì)有數(shù)據(jù)庫名的限定)
@Embeddable表示一個(gè)非Entity類可以嵌入到另一個(gè)Entity中作為屬性存在缤苫,即一個(gè)用戶自定義的類型可以作為數(shù)據(jù)庫表的屬性(定義在自定義類的.class處)
屬性級(jí)別注解:
添加方式:
一是寫在屬性字段上面
二是寫在屬性的get訪問器的上面
@Id:必須速兔,定義了映射到數(shù)據(jù)庫表的主鍵的屬性,一個(gè)實(shí)體類可以有一個(gè)或者多個(gè)屬性被映射到主鍵活玲,可置于主鍵屬性或者其getter前
如果是聯(lián)合主鍵涣狗,該實(shí)體類必須實(shí)現(xiàn) Serializable
字符串作為主鍵屬性,長(zhǎng)度不能太長(zhǎng)
隨著版本更新舒憾,這兩個(gè)問題或?qū)⒉淮嬖?br>
@GeneratedValue( strategy = Generation.AUTO(主鍵由程序自動(dòng)控制)镀钓,generator = "")
Generation.identity才是主鍵自增長(zhǎng)
可選,用于定義主鍵生成策略
將string類型作為屬性镀迂,并為手工賦值
@Id
@GeneratedValue(generator="sid")
@GenericGenerator(name="sid",strategy="assigned")
@Column描述了數(shù)據(jù)庫表中該字段的詳細(xì)定義
常用屬性:length丁溅,可選,表示該字段的大小探遵,僅對(duì)String類型的字段有效窟赏,默認(rèn)值是255
@embedded是注釋屬性的,表示該屬性的類是嵌入類
注意:同時(shí)嵌入類也必須標(biāo)注@Embeddable
@EmbeddedId使用嵌入式主鍵類實(shí)現(xiàn)復(fù)合主鍵
注意:嵌入式主鍵類必須實(shí)現(xiàn)Serializable接口箱季、必須有默認(rèn)的public無參數(shù)的構(gòu)造方法涯穷,必須覆蓋equals()和hashCode()方法
@Transient:可選,表示該屬性并非一個(gè)到數(shù)據(jù)庫表的字段的映射藏雏,ORM框架將忽略該屬性拷况,如果一個(gè)屬性并非數(shù)據(jù)庫表的字段映射,就務(wù)必將其表示標(biāo)志為@Transient掘殴,否則ORM框架默認(rèn)其注解為@Basic
一對(duì)一單向外鍵:
寫在主表類處
@OneToOne(cascade=CascadeType.ALL(指定級(jí)聯(lián)關(guān)系))
@JoinColumn(name="pid", unique="true")把被控類的主鍵寫到主控類中
一對(duì)一雙向外鍵:
主控方的配置同一對(duì)一單向外鍵
@OneToOne(mappedBy="card")(寫在被控方的主控方引用上面赚瘦,值是被控的屬性的變量)
雙向關(guān)聯(lián),必須設(shè)置mappedBy屬性奏寨,因?yàn)殡p向關(guān)聯(lián)只能交給一方去控制起意,不可能在雙方都設(shè)置外鍵保存關(guān)聯(lián)關(guān)系,否則雙方都無法保存
一對(duì)一雙向外鍵聯(lián)合主鍵:
主鍵類必須實(shí)現(xiàn)serializable聲明式接口服爷,重寫hashCode()方法和equals()方法
主鍵類@Embeddable
實(shí)體類@EmbeddedId
多對(duì)一單向外鍵:
多方持有一方的引用
@ManyToOne(cascade={CascadeType.ALL}杜恰,fetch=FetchType.EAGER)
@JoinColumn(name="cid(和一對(duì)多一樣)"获诈,referencedColumnName="CID")
@JoinColumn中的name為當(dāng)前類的屬性名,(多對(duì)一單向心褐,有多方維護(hù))所以舔涎,name為student中的cid,而ReferenceColumnName為引用表的列(多對(duì)一單向逗爹,所以為一方的引用列)即ClassRoom中的主鍵列
一對(duì)多單向外鍵:
一方持有多方的集合亡嫌,一個(gè)班級(jí)有多個(gè)學(xué)生(一對(duì)多)
在集合上設(shè)置
@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="cid")(一方的主鍵)
一對(duì)多的時(shí)候掘而,一的內(nèi)部是個(gè)集合挟冠,為了減小數(shù)據(jù)庫的壓力,少加載數(shù)據(jù)所以用LAZZY加載袍睡,反之知染,多對(duì)一的時(shí)候每個(gè)多方只多加載一條數(shù)據(jù),所以可以用EAGER加載
多對(duì)多單向外鍵
學(xué)生和教師構(gòu)成多對(duì)多的關(guān)聯(lián)關(guān)系
其中一方持有另一方的集合對(duì)象(學(xué)生擁有教師的集合)
創(chuàng)建中間表
//學(xué)生類
@ManyToMany
@JoinTable(
?? name="teachers_students",
?? joinColumns={@JoinColumn(name="sid")},
?? inverseJoinColumns={JoinColumn(name="tid")}
)
多對(duì)多雙向外鍵
雙方持有對(duì)方的集合對(duì)象斑胜,
//教師類
@ManyToMany(mappedBy="teachers")(將主控方交給學(xué)生類)