框架學習之JPA(二)
JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。java
Sun引入新的JPA ORM規範出於兩個緣由:其一,簡化現有Java EE和Java SE應用開發工做;其二,Sun但願整合ORM技術,實現天下歸一。sql
學習視頻:尚硅谷框架jpa學習(有興趣的同窗留言郵箱)數據庫
使用軟件:eclipse框架
Java版本:jdk8eclipse
本節目錄
2、JPA_基本註解ide
1.基本的六個註解學習
@Entityfetch
@Tablespa
@Idcode
@GeneratedValue
@Column
@Basic
2.@Transient
3.@Temporal
4.用Table生成主鍵
2、JPA_基本註解
若是@Id註解放在get方法上面,默認找到其set方法而後才映射到數據庫中,全部的get方法都會按照這個規則進行
若是@Id註解放在屬性名上面,則默認會映射屬性,不管會不會有get和set方法,全部的屬性都會按照這個規則進行
注:我本身總結的規則,多是錯誤的
1.基本的六個註解
@Entity
@Table
@Id
@GeneratedValue
@Column
@Basic
1)@Entity
- @Entity標註用於實體類聲明語句以前,指出該java類爲實體類,將映射到指定的數據庫表。
2)@Table
- 當實體類與其映射的數據庫表名不一樣名時須要使用@Table標註說明,該標註與@Entity並列使用,置於實體類聲明語句以前,可寫於單獨語句行,也可與聲明語句同行。若是不加@Table,默認表名爲類名。
- @Table標註的經常使用選項name,用於致命數據表的表名
- @Table還有兩個選項catalog和schema用於設置表所屬的數據庫目錄或模式,一般爲數據庫名。uniqueConstraints選項用於設置約束條件,一般不設置。
3)@Id
- @Id標註用於聲明一個實體類的屬性映射爲數據庫的主鍵列。該屬性一般置於屬性聲明語句以前,可與生命語句同行,也能夠寫在單獨行上。
- @Id標註也能夠置於屬性的getter方法以前。
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標註的column經常使用屬性是name,用於設置映射數據庫表的列名,此外,該註解還包含其餘多個屬性,如:unique,nullable,length等。
- @Column標註的columnDefinition屬性:表示該字段在數據庫中的實際類型,一般ORM框架能夠根據屬性類型自動判斷數據庫中的字段類型,可是對於Date類型仍沒法肯定數據庫中字段類型到底是Date,Time仍是TimeStamp。此外,String的默認映射類型爲VARCHAR,若是要將String類型映射到特定數據庫的BLOB或者TEXT字段類型
- @Column標註也能夠置於屬性的getter方法以前
2.@Transient
- 表示該屬性並不是一個到數據庫表的字段的映射,ORM框架將忽略該屬性
- 若是一個屬性並不是數據庫表的字段映射,就務必將其標註爲@Transient不然ORM框架默認其註解爲@Basic
3.@Temporal
- 在覈心的Java API中沒有定義Date類型的精度(temporal precision)。而在數據庫中,表示Date類型的數據有DATE,TIME和TIMESTAMP三種精度(即單純的日期,時間,或者二者兼備)。在進行屬性映射時可使用@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)生成效果
兩張表的數據都會進行修改