一、經常使用基本註解java
@Entity git
@Tablegithub
@Basic數據庫
@Column框架
@GeneratedValueide
@Id工具
二、特殊註解fetch
@Transientspa
@Temporalcode
用 table 來生成主鍵
三、經常使用註解的使用
一、@Entity 標註用於實體類聲明語句以前,指出該Java 類爲實體類,將映射到指定的數據庫表。如聲明一個實體類 Customer,它將映射到數據庫中的 customer 表上。
二、@Table
當實體類與其映射的數據庫表名不一樣名時須要使用 @Table 標註說明,該標註與 @Entity 標註並列使用,置於實體類聲明語句以前,可寫於單獨語句行,也可與聲明語句同行。
@Table 標註的經常使用選項是 name,用於指明數據庫的表名 @Table標註還有一個兩個選項 catalog 和 schema 用於設置表所屬的數據庫目錄或模式,一般爲數據庫名。
uniqueConstraints 選項用於設置約束條件,一般不須設置。以下代碼:
@Table(name="JPA_CUSTOMERS")//主要是映射表名對應的數據庫表名JPA_CUSTOMER默認狀況下能夠不寫表名與持久化類名相同 @Entity //代表這是一個持久化類
public class Customer {
三、@Id
@Id 標註用於聲明一個實體類的屬性映射爲數據庫的主鍵列。該屬性一般置於屬性聲明語句以前,可與聲明語句同行,也可寫在單獨行上。 @Id標註也可置於屬性的getter方法以前。
//定義主鍵,生成主鍵的策略AUTO自動的根據數據的類型生成主鍵 @GeneratedValue(strategy=GenerationType.AUTO) @Id //定義數據列 // @Column(name="ID")//定義數據庫的列名若是與字段名同樣能夠省略 public Integer getId() { return id; }
四、@GeneratedValue
@GeneratedValue 用於標註主鍵的生成策略,經過 strategy 屬性指定。默認狀況下,JPA 自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer 對應 identity,MySQL 對應 auto increment。 在 javax.persistence.GenerationType 中定義瞭如下幾種可供選擇的策略:
IDENTITY:採用數據庫 ID自增加的方式來自增主鍵字段,Oracle 不支持這種方式;
AUTO: JPA自動選擇合適的策略,是默認選項;
SEQUENCE:經過序列產生主鍵,經過 @SequenceGenerator 註解指定序列名,MySql 不支持這種方式
TABLE:經過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可使應用更易於數據庫移植。
五、@Basic
@Basic 表示一個簡單的屬性到數據庫表的字段的映射,對於沒有任何標註的 getXxxx() 方法,默認即爲
@Basic fetch: 表示該屬性的讀取策略,有 EAGER 和 LAZY 兩種,分別表示主支抓取和延遲加載,默認爲 EAGER.
optional:表示該屬性是否容許爲null, 默認爲true
六、@Column
當實體的屬性與其映射的數據庫表的列不一樣名時須要使用@Column 標註說明,該屬性一般置於實體的屬性聲明語句以前,還可與 @Id 標註一塊兒使用。
@Column 標註的經常使用屬性是 name,用於設置映射數據庫表的列名。此外,該標註還包含其它多個屬性,如:unique 、nullable、length 等。
@Column 標註的 columnDefinition 屬性: 表示該字段在數據庫中的實際類型.一般 ORM 框架能夠根據屬性類型自動判斷數據庫中字段的類型,可是對於Date類型仍沒法肯定數據庫中字段類型到底是DATE,TIME仍是TIMESTAMP.此外,String的默認映射類型爲VARCHAR, 若是要將 String 類型映射到特定數據庫的 BLOB 或TEXT 字段類型.
@Column標註也可置於屬性的getter方法以前
四、特殊註解的使用
一、@Transient
.表示該屬性並不是一個到數據庫表的字段的映射,ORM框架將忽略該屬性.
.若是一個屬性並不是數據庫表的字段映射,就務必將其標示爲@Transient,不然,ORM框架默認其註解爲@Basic
//工具方法,不須要映射爲數據表的一列 @Transient public String getInfo(){ return "lastName:"+lastName+",email:"+email; }
二、@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; }
三、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; }
其中:
一、name 屬性表示該主鍵生成策略的名稱,它被引用在@GeneratedValue中設置的generator 值中
二、table 屬性表示表生成策略所持久化的表名
三、pkColumnName 屬性的值表示在持久化表中,該主鍵生成策略所對應鍵值的名稱
四、valueColumnName 屬性的值表示在持久化表中,該主鍵當前所生成的值,它的值將會隨着每次建立累加
五、pkColumnValue 屬性的值表示在持久化表中,該生成策略所對應的主鍵
六、allocationSize 表示每次主鍵值增長的大小, 默認值爲 50
關係圖:
源碼地址:https://github.com/wuhongpu/JPA.git