07-1.JPA常用註解

Play Framework框架 JPA常用註解

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

}

 

 

發佈了8 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章