天天看點

JPA & Hibernate 注解

1 、 @Entity(name="EntityName")

必須 ,name 為可選 , 對應資料庫中一的個表

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 的主鍵名稱

見 @ManyToOne

10 、 @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: 表示多對多關聯的另一個實體類的對應集合屬性名稱

User 實體表示使用者 ,Book 實體表示書籍 , 為了描述使用者收藏的書籍 , 可以在 User 和 Book 之間建立ManyToMany 關聯

@Entity

public class User {

private List books;

@ManyToMany(targetEntity=package.Book.class)

public List getBooks() {

return books;

public void setBooks(List books) {

this.books=books;

public class Book {

private List users;

@ManyToMany(targetEntity=package.Users.class, mappedBy="books")

public List getUsers() {

return users;

public void setUsers(List users) {

this.users=users;

兩個實體間互相關聯的屬性必須标記為 @ManyToMany, 并互相指定 targetEntity 屬性 ,

需要注意的是 , 有且隻有一個實體的 @ManyToMany 注解需要指定 mappedBy 屬性

13、@TransactionAttribute

事務管理服務

最有用的容器服務可能就是事務管理服務,當應用出現失敗或異常時,它保證了資料庫的完整性。你可以簡單地将為一個 POJO方法申明它的事務屬性。這樣容器就可以在合适的上下文中運作這個方法。最常見的事務是定義在 session bean 的方法上,方法中所有的資料庫操作隻有在方法正常退出時才會送出,如果方法抛出未捕獲的異常,事務管理将復原所有的變更。

@TransactionAttribute 注釋用作定義一個需要事務的方法。例如:

@TransactionAttribute(TransactionAttributeType.REQUIRED)

public void insertProduct(String name, Float price, boolean error) {

它可以有以下參數:

a. REQUIRED : 方法在一個事務中執行,如果調用的方法已經在一個事務中,則使用該事務,否則将建立一個新的事務。

b. MANDATORY : 方法必須在一個事務中執行,也就是說調用的方法必須已經有一個事務,否則新抛出一個錯誤(ERROR )。

c. REQUIRESNEW : 方法将在一個新的事務中執行,如果調用的方法已經在一個事務中,則暫停舊的事務。

d. SUPPORTS : 如果方法在一個事務中被調用,則使用該事務,否則不使用事務。

e. NOT_SUPPORTED :如果方法在一個事務中被調用,将抛出一個錯誤( ERROR )

如果沒有指定參數, @TransactionAttribute 注釋使用 REQUIRED 作為預設參數。

14、@PersistenceContextType

PersistenceContextType.EXTENDED。在預設情況下,EntityManagers用TRANSACTION的 PersistenceContextType來建立。這樣做也就表示,隻有當有活動的事務處理在進行時,實體才是可托管的。事務處理一結束,實體就與實 體管理程式脫離,這樣我們就可以丢棄它。EXTENDED上下文類型表示這種脫離不會發生,即使在事務處理結束後實體仍然是可托管的。這就意味着你不需要 擔心集合是否被暫緩取回,因為實體管理程式可以用來完成所需要的取回操作。當我們想要保持和更新/合并實體,或者從資料庫裡删除實體的時候,我們仍然需要 獲得EntityTransaction,例如我們想要儲存一個新的Application實體:

public void saveApplication(Application a) { 

   EntityTransaction tx=em.getTransaction(); 

   tx.begin(); 

   em.persist(a); 

   tx.commit();