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;

       }

    }

   

    @Entity

    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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章