JPA之常用 基本注解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM