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