Play Framework框架 JPA慣用註解

Play Framework框架 JPA經常使用註解 
一、@Entity(name=」EntityName」) 
必須 ,name 爲可選 , 對應數據庫中一的個表數據庫

二、@Table(name=」",catalog=」",schema=」") 
可選 , 一般和 @Entity 配合使用 , 只能標註在實體的 class 定義處 , 表示實體對應的數據庫表的信息 
name: 可選 , 表示表的名稱 . 默認地 , 表名和實體名稱一致 , 只有在不一致的狀況下才須要指定表名 
catalog: 可選 , 表示 Catalog 名稱 , 默認爲 Catalog(「」). 
schema: 可選 , 表示 Schema 名稱 , 默認爲 Schema(「」).session

三、@id 
必須 
@id 定義了映射到數據庫表的主鍵的屬性 , 一個實體只能有一個屬性被映射爲主鍵 . 置於 getXxxx() 前 .app

四、@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; 
}框架

五、@Basic(fetch=FetchType,optional=true) 
可選 
@Basic 表示一個簡單的屬性到數據庫表的字段的映射 , 對於沒有任何標註的 getXxxx() 方法 , 默認即爲 @Basic 
fetch: 表示該屬性的讀取策略 , 有 EAGER 和 LAZY 兩種 , 分別表示主支抓取和延遲加載 , 默認爲 EAGER. 
optional: 表示該屬性是否容許爲 null, 默認爲 true 
示例 : 
@Basic(optional=false) 
public String getAddress() { 
return address; 
}工具

六、@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; 
}fetch

七、@Transient 
可選 
@Transient 表示該屬性並不是一個到數據庫表的字段的映射 ,ORM 框架將忽略該屬性 . 
若是一個屬性並不是數據庫表的字段映射 , 就務必將其標示爲 @Transient, 不然 ,ORM 框架默認其註解爲 @Basic 
示例 : 
// 根據 birth 計算出 age 屬性 
@Transient 
public int getAge() { 
return getYear(new Date()) – getYear(birth); 
}ui

八、@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; 
}this

九、@JoinColumn 
可選 
@JoinColumn 和 @Column 相似 , 介量描述的不是一個簡單字段 , 而一一個關聯字段 , 例如 . 描述一個 @ManyToOne 的字段 . 
name: 該字段的名稱 . 因爲 @JoinColumn 描述的是一個關聯字段 , 如 ManyToOne, 則默認的名稱由其關聯的實體決定 . 
例如 , 實體 Order 有一個 user 屬性來關聯實體 User, 則 Order 的 user 屬性爲一個外鍵 , 
其默認的名稱爲實體 User 的名稱 + 下劃線 + 實體 User 的主鍵名稱 
示例 : 
見 @ManyToOne.net

十、@OneToMany(fetch=FetchType,cascade=CascadeType) 
可選 
@OneToMany 描述一個一對多的關聯 , 該屬性應該爲集體類型 , 在數據庫中並無實際字段 . 
fetch: 表示抓取策略 , 默認爲 FetchType.LAZY, 由於關聯的多個對象一般沒必要從數據庫預先讀取到內存 
cascade: 表示級聯操做策略 , 對於 OneToMany 類型的關聯很是重要 , 一般該實體更新或刪除時 , 其關聯的實體也應當被更新或刪除 
例如 : 實體 User 和 Order 是 OneToMany 的關係 , 則實體 User 被刪除時 , 其關聯的實體 Order 也應該被所有刪除 
示例 : 
@OneTyMany(cascade=ALL) 
public List getOrders() { 
return orders; 
}對象

十一、@OneToOne(fetch=FetchType,cascade=CascadeType) 
可選 
@OneToOne 描述一個一對一的關聯 
fetch: 表示抓取策略 , 默認爲 FetchType.LAZY 
cascade: 表示級聯操做策略 
示例 : 
@OneToOne(fetch=FetchType.LAZY) 
public Blog getBlog() { 
return blog; 
}

十二、@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 屬性

1三、@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 做爲默認參數。

1四、@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(); 
}

 

 

原文  http://www.anool.net/?p=959

相關文章
相關標籤/搜索