本文由Hibernate注解版關聯關系映射全解析+案例修改而來. 1、@Entity(name=”EntityName”) 必須,name為可選,對應數據庫中一的個表,此處的EntryName要注意,在代碼中使用hql進行查詢時,需要from Xxx,那么Xxx就是對應的此處的EntryName,所以要注意EntryName的命名,否則會出現映射問題。 2、@Table(name=”“,catalog=”“,schema=”“) 可選,通常和@Entity配合使用,只能標注在實體的class定義處,表示實體對應的數據庫表的信息
name:可選,表示表的名稱。默認地,表名和實體名稱一致,只有在不一致的情況下才需要指定表名 catalog:可選,表示Catalog名稱。默認為Catalog(“”) schema:可選,表示Schema名稱。默認為Schema(“”)
3、@id 必須
@id定義了映射到數據庫表的主鍵的屬性,一個實體只能有一個屬性被映射為主鍵。置于getXxxx()前
4、@GeneratedValue(strategy=GenerationType,generator=”“) 可選
strategy:表示主鍵生成策略,有AUTO、INDENTITY、SEQUENCE和 TABLE 4種,分別表示讓ORM框架自動選擇、根據數據庫的Identity字段生成、根據數據庫表的Sequence字段生成、以及根據一個額外的表生成主鍵。默認為AUTO
generator:表示主鍵生成器的名稱,這個屬性通常和ORM框架相關。例如,Hibernate可以指定uuid等主鍵生成方式
示例:
@Id @GeneratedValues(strategy=StrategyType.SEQUENCE) public int getPk() { return pk; }5、@Basic(fetch=FetchType,optional=true) 可選
@Basic表示一個簡單的屬性到數據庫表的字段的映射,對于沒有任何標注的getXxxx()方法。默認即為@Basic
fetch:表示該屬性的讀取策略,有EAGER和LAZY兩種,分別表示主支抓取和延遲加載。默認為EAGER optional:表示該屬性是否允許為null,默認為true 示例:
@Basic(optional=false) public String getAddress() { return address; }6、@Column 可選
@Column描述了數據庫表中該字段的詳細定義,這對于根據JPA注解生成數據庫表結構的工具非常有作用 name:表示數據庫表中該字段的名稱。默認情形屬性名稱一致 nullable:表示該字段是否允許為null。默認為true unique:表示該字段是否是唯一標識。默認為false length:表示該字段的大小,僅對String類型的字段有效 insertable:表示在ORM框架執行插入操作時,該字段是否應出現INSETRT語句中。默認為true updateable:表示在ORM框架執行更新操作時,該字段是否應該出現在UPDATE語句中,默認為true。對于一經創建就不可以更改的字段,該屬性非常有用,如對于birthday字段 columnDefinition:表示該字段在數據庫中的實際類型。通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,但是對于Date類型仍無法確定數據庫中字段類型究竟是DATE、TIME還是TIMESTAMP。此外,String的默認映射類型為VARCHAR,如果要將String類型映射到特定數據庫的BLOB或TEXT字段類型,該屬性非常有用 示例:
@Column(name="BIRTH",nullable="false",columnDefinition="DATE") public String getBithday() { return birthday; }7、@Transient 可選
@Transient表示該屬性并非一個到數據庫表的字段的映射,ORM框架將忽略該屬性
如果一個屬性并非數據庫表的字段映射,就務必將其標示為@Transient,否則,ORM框架默認其注解為@Basic
示例:
//根據birth計算出age屬性 @Transient public int getAge() { return getYear(new Date()) -getYear(birth); }8、@ManyToOne(fetch=FetchType,cascade=CascadeType) 可選
@ManyToOne表示一個多對一的映射,該注解標注的屬性通常是數據庫表的外鍵
optional:是否允許該字段為null,該屬性應該根據數據庫表的外鍵約束來確定,默認為true fetch:表示抓取策略,默認為FetchType.EAGER cascade:表示默認的級聯操作策略,可以指定為ALL、PERSIST、MERGE、REFRESH和REMOVE中的若干組合,默認為無級聯操作 targetEntity:表示該屬性關聯的實體類型,該屬性通常不必指定,ORM框架根據屬性類型自動判斷targetEntity
示例:
//訂單Order和用戶User是一個ManyToOne的關系 //在Order類中定義 @ManyToOne() @JoinColumn(name="USER") public User getUser() { return user; }9、@JoinColumn 可選
@JoinColumn和@Column類似,介量描述的不是一個簡單字段,而是一個關聯字段,例如,描述一個@ManyToOne的字段.
name:該字段的名稱,由于@JoinColumn描述的是一個關聯字段,如ManyToOne,則默認的名稱由其關聯的實體決定.
例如,實體Order有一個user屬性來關聯實體User,則Order的user屬性為一個外鍵
其默認的名稱為實體User的名稱+下劃線+實體User的主鍵名稱
示例:
見@ManyToOne10、@OneToMany(fetch=FetchType,cascade=CascadeType) 可選
@OneToMany描述一個一對多的關聯,該屬性應該為集體類型,在數據庫中并沒有實際字段
fetch:表示抓取策略,默認為FetchType.LAZY,因為關聯的多個對象通常不必從數據庫預先讀取到內存 cascade:表示級聯操作策略,對于OneToMany類型的關聯非常重要,通常該實體更新或刪除時,其關聯的實體也應當被更新或刪除
例如:實體User和Order是OneToMany的關系,則實體User被刪除時,其關聯的實體Order也應該被全部刪除
示例:
@OneTyMany(cascade=ALL) public List getOrders() { return orders; }11、@OneToOne(fetch=FetchType,cascade=CascadeType) 可選
@OneToOne描述一個一對一的關聯
fetch:表示抓取策略,默認為FetchType.LAZY
cascade:表示級聯操作策略
示例:
@OneToOne(fetch=FetchType.LAZY) public Blog getBlog() { return blog; }12、@ManyToMany 可選
@ManyToMany描述一個多對多的關聯,多對多關聯上是兩個一對多關聯,但是在ManyToMany描述中,中間表是由ORM框架自動處理
targetEntity:表示多對多關聯的另一個實體類的全名,例如:package.Book.class
mappedBy:表示多對多關聯的另一個實體類的對應集合屬性名稱
13、@MappedSuperclass 可選
@MappedSuperclass可以將超類的JPA注解傳遞給子類,使子類能夠繼承超類的JPA注解
示例:
@MappedSuperclass public class Employee() { .... } @Entity public class Engineer extends Employee { ..... } @Entity public class Manager extends Employee { ..... }14、@Embedded
可選
@Embedded將幾個字段組合成一個類,并作為整個Entity的一個屬性
例如User包括id、name、city、street、zip屬性
我們希望city、street、zip屬性映射為Address對象。這樣,User對象將具有id、name和address這三個屬性.
Address對象必須定義為@Embededable
示例:
@Embeddable public class Address {city,street,zip} @Entity public class User { @Embedded public Address getAddress() { .......... }Ctrl + B
斜體 Ctrl + I
引用 Ctrl + Q
插入鏈接 Ctrl + L
插入代碼 Ctrl + K
插入圖片 Ctrl + G
提升標題 Ctrl + H
有序列表 Ctrl + O
無序列表 Ctrl + U
橫線 Ctrl + R
撤銷 Ctrl + Z
Ctrl + Y
新聞熱點
疑難解答