1、常用基本注解
@Entity
@Table
@Basic
@Column
@GeneratedValue
@Id
2、特殊注解
@Transient
@Temporal
用 table 來生成主鍵
3、常用注解的使用
1、@Entity 標注用於實體類聲明語句之前,指出該Java 類為實體類,將映射到指定的數據庫表。如聲明一個實體類 Customer,它將映射到數據庫中的 customer 表上。
2、@Table
當實體類與其映射的數據庫表名不同名時需要使用 @Table 標注說明,該標注與 @Entity 標注並列使用,置於實體類聲明語句之前,可寫於單獨語句行,也可與聲明語句同行。
@Table 標注的常用選項是 name,用於指明數據庫的表名 @Table標注還有一個兩個選項 catalog 和 schema 用於設置表所屬的數據庫目錄或模式,通常為數據庫名。
uniqueConstraints 選項用於設置約束條件,通常不須設置。如下代碼:
-
@Table(name="JPA_CUSTOMERS")//主要是映射表名對應的數據庫表名JPA_CUSTOMER默認情況下可以不寫表名與持久化類名相同 @Entity //表明這是一個持久化類
public class Customer {
3、@Id
@Id 標注用於聲明一個實體類的屬性映射為數據庫的主鍵列。該屬性通常置於屬性聲明語句之前,可與聲明語句同行,也可寫在單獨行上。 @Id標注也可置於屬性的getter方法之前。
//定義主鍵,生成主鍵的策略AUTO自動的根據數據的類型生成主鍵 @GeneratedValue(strategy=GenerationType.AUTO) @Id //定義數據列 // @Column(name="ID")//定義數據庫的列名如果與字段名一樣可以省略 public Integer getId() { return id; }
4、@GeneratedValue
@GeneratedValue 用於標注主鍵的生成策略,通過 strategy 屬性指定。默認情況下,JPA 自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer 對應 identity,MySQL 對應 auto increment。 在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:
IDENTITY:采用數據庫 ID自增長的方式來自增主鍵字段,Oracle 不支持這種方式;
AUTO: JPA自動選擇合適的策略,是默認選項;
SEQUENCE:通過序列產生主鍵,通過 @SequenceGenerator 注解指定序列名,MySql 不支持這種方式
TABLE:通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易於數據庫移植。
5、@Basic
@Basic 表示一個簡單的屬性到數據庫表的字段的映射,對於沒有任何標注的 getXxxx() 方法,默認即為
@Basic fetch: 表示該屬性的讀取策略,有 EAGER 和 LAZY 兩種,分別表示主支抓取和延遲加載,默認為 EAGER.
optional:表示該屬性是否允許為null, 默認為true
6、@Column
當實體的屬性與其映射的數據庫表的列不同名時需要使用@Column 標注說明,該屬性通常置於實體的屬性聲明語句之前,還可與 @Id 標注一起使用。
@Column 標注的常用屬性是 name,用於設置映射數據庫表的列名。此外,該標注還包含其它多個屬性,如:unique 、nullable、length 等。
@Column 標注的 columnDefinition 屬性: 表示該字段在數據庫中的實際類型.通常 ORM 框架可以根據屬性類型自動判斷數據庫中字段的類型,但是對於Date類型仍無法確定數據庫中字段類型究竟是DATE,TIME還是TIMESTAMP.此外,String的默認映射類型為VARCHAR, 如果要將 String 類型映射到特定數據庫的 BLOB 或TEXT 字段類型.
@Column標注也可置於屬性的getter方法之前
4、特殊注解的使用
1、@Transient
.表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性.
.如果一個屬性並非數據庫表的字段映射,就務必將其標示為@Transient,否則,ORM框架默認其注解為@Basic
//工具方法,不需要映射為數據表的一列 @Transient public String getInfo(){ return "lastName:"+lastName+",email:"+email; }
2、@Temporal
在核心的 Java API 中並沒有定義 Date 類型的精度(temporal precision). 而在數據庫中,表示 Date 類型的數據有 DATE, TIME, 和 TIMESTAMP 三種精度(即單純的日期,時間,或者兩者 兼備).
在進行屬性映射時可使用@Temporal注解來調整精度.
@Temporal(TemporalType.TIMESTAMP)// 時間戳 public Date getCreatedTime() { return createdTime; } @Temporal(TemporalType.DATE) //時間精確到天 public Date getBirth() { return birth; }
3、table生成主鍵的使用(用的比較少)
將當前主鍵的值單獨保存到一個數據庫的表中,主鍵的值每次都是從指定的表中查詢來獲得 這種方法生成主鍵的策略可以適用於任何數據庫,不必擔心不同數據庫不兼容造成的問題。
//使用table生成主鍵 @TableGenerator(name="ID_GENERATOR", table="JPA_ID_GENERATORS", pkColumnName="PK_NAME", pkColumnValue="CUSTOMER_ID", valueColumnName="PK_VALUE", allocationSize=100 ) @GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR") @Id public Integer getId() { return id; }
其中:
1、name 屬性表示該主鍵生成策略的名稱,它被引用在@GeneratedValue中設置的generator 值中
2、table 屬性表示表生成策略所持久化的表名
3、pkColumnName 屬性的值表示在持久化表中,該主鍵生成策略所對應鍵值的名稱
4、valueColumnName 屬性的值表示在持久化表中,該主鍵當前所生成的值,它的值將會隨着每次創建累加
5、pkColumnValue 屬性的值表示在持久化表中,該生成策略所對應的主鍵
6、allocationSize 表示每次主鍵值增加的大小, 默認值為 50
關系圖:
源碼地址:https://github.com/wuhongpu/JPA.git