1. 程式人生 > >JPA學習(二、JPA_基本註解)

JPA學習(二、JPA_基本註解)

自增 簡化 留言 uniq 產生 規範 pri blob 時間

框架學習之JPA(二)

JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0註解或XML描述對象-關系表的映射關系,並將運行期的實體對象持久化到數據庫中。

Sun引入新的JPA ORM規範出於兩個原因:其一,簡化現有Java EE和Java SE應用開發工作;其二,Sun希望整合ORM技術,實現天下歸一。

學習視頻:尚矽谷框架jpa學習(有興趣的同學留言郵箱)

使用軟件:eclipse

Java版本:jdk8

本節目錄

二、JPA_基本註解

1.基本的六個註解

@Entity

@Table

@Id

@GeneratedValue

@Column

@Basic

2.@Transient

3.@Temporal

4.Table生成主鍵

二、JPA_基本註解

如果@Id註解放在get方法上面,默認找到其set方法然後才映射到數據庫中,所有的get方法都會按照這個規則進行

如果@Id註解放在屬性名上面,則默認會映射屬性,無論會不會有getset方法,所有的屬性都會按照這個規則進行

註:我自己總結的規則,可能是錯誤的

1.基本的六個註解

@Entity

@Table

@Id

@GeneratedValue

@Column

@Basic

1)@Entity

  • @Entity標註用於實體類聲明語句之前,指出該java類為實體類,將映射到指定的數據庫表。

2)@Table

  • 當實體類與其映射的數據庫表名不同名時需要使用@Table標註說明,該標註與@Entity並列使用,置於實體類聲明語句之前,可寫於單獨語句行,也可與聲明語句同行。如果不加@Table,默認表名為類名。
  • @Table標註的常用選項name,用於致命數據表的表名
  • @Table還有兩個選項catalogschema用於設置表所屬的數據庫目錄或模式,通常為數據庫名。uniqueConstraints選項用於設置約束條件,通常不設置。

3)@Id

  • @Id標註用於聲明一個實體類的屬性映射為數據庫的主鍵列。該屬性通常置於屬性聲明語句之前,可與生命語句同行,也可以寫在單獨行上。
  • @Id標註也可以置於屬性的getter方法之前。

4)@GeneratedValue

  • @GeneratedValue 用於標註主鍵生成策略,通過strategy屬性指定。默認情況下,JPA自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer對應identityMySQL對應auto或者increment
  • javax.persistence.GenerationType定義了一下幾種可供選擇的策略:
    • IDENTITY:采用數據庫ID自增長的方式來自增主鍵字段,Oracle不支持這種方式
    • AUTOJPA自動選擇合適的策略,是默認選項
    • SEQUENCE:通過序列生成主鍵,通過@SequenceGenerator註解指定序列名,Mysql不支持這種方式
    • TABLE:通過表產生主鍵,框架借由表模擬序列產生主鍵使用該策略可以使應用更易於數據庫移植

5)@Basic

  • @Basic表示一個簡單的屬性到數據庫表的字段的映射,對於沒有任何標註的getXxxx()方法。默認為@Basic
  • fetch:表示該屬性的讀取策略,有EAGERLAZY兩種,分別表示主支抓取和延遲加載,默認為EAGER
  • Optional:表示該屬性是否允許為null,默認為true

6)@Column

  • 當實體的屬性與其映射的數據表的列名不同時需要使用,@Column註解說明,該屬性通常置於實體的屬性聲明語句之前,還可以與@Id一起使用。
  • @Column標註的column常用屬性是name,用於設置映射數據庫表的列名,此外,該註解還包含其他多個屬性,如:uniquenullablelength等。
  • @Column標註的columnDefinition屬性:表示該字段在數據庫中的實際類型,通常ORM框架可以根據屬性類型自動判斷數據庫中的字段類型,但是對於Date類型仍無法確定數據庫中字段類型究竟是DateTime還是TimeStamp。此外,String的默認映射類型為VARCHAR,如果要將String類型映射到特定數據庫的BLOB或者TEXT字段類型
  • @Column標註也可以置於屬性的getter方法之前

2.@Transient

  • 表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性
  • 如果一個屬性並非數據庫表的字段映射,就務必將其標註為@Transient否則ORM框架默認其註解為@Basic

3.@Temporal

  • 在核心的Java API中沒有定義Date類型的精度(temporal precision)。而在數據庫中,表示Date類型的數據有DATETIMETIMESTAMP三種精度(即單純的日期,時間,或者兩者兼備)。在進行屬性映射時可以使用@Temporal註解來調整精度

4.Table生成主鍵

通過其他的表的內容來生成主鍵ID,使用於所有的數據庫,但是這個使用的幾率很小

1)創建一個jpa_id_generators

技術分享圖片

2)設置主鍵的標簽(主鍵部分的java代碼)

@Id

@GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR")

@TableGenerator(name="ID_GENERATOR",

table="jpa_id_generators",

pkColumnName="PK_NAME",

pkColumnValue="CUSTOMER_ID",

valueColumnName="PK_VALUE",

allocationSize=100)

private Integer id;


3)生成效果

兩張表的數據都會進行修改

技術分享圖片

JPA學習(二、JPA_基本註解)