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