JPA概要
1、jpa概述
JPA(Java Persistence API)作爲JavaEE5.0平臺標準的ORM規範,將得到所有Java EE服務器的支持。sun公司在充
分吸收現有ORM框架的基礎上,得到了一個易於使用、伸縮性強的ORM規範。從目 前的開發社區的反應上看,JPA
受到了極大的支持和讚揚,JPA作爲ORM領域標準化整合者的目標應該不難實現。JPA通過JDK 5.0註解或XML描述對
象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中,圖1很好地描述了JPA的結構:
2 實體生命週期
實體生命週期是JPA中非常重要的概念,描述了實體對象從創建到受控、從刪除到遊離的狀態變換。對實體的操作主
要就是改變實體的狀態。
JPA中實體的生命週期如下圖:
1 New,新創建的實體對象,沒有主鍵(identity)值,也稱初始狀態
2 Managed,有id值,對象處於持久化上下文(Persistence Context)中,被EntityManager管理
3 Detached,遊離狀態,有id值,當對象已經遊離到Persistence Context之外,進入Application Domain
4 Removed, 實體對象被刪除,有id值,和Persistence Context有關聯,但已經準備好從數據庫中刪除。
EntityManager提供一系列的方法管理實體對象的生命週期,包括:
5 persist, 將新創建的或已刪除的實體轉變爲Managed(持久化)狀態,數據存入數據庫。
6 remove,將受控的實體移除掉。
7 merge,將遊離實體轉變爲Managed狀態,數據存入數據庫。
8 refresh,自動刷新。
3、實體關係映射
基本關係映射
實體 |
數據庫 |
jpa註解 |
可變設置 |
Class(User) |
Table(USER) |
@Entity |
name="t_user" |
id |
id(primary key) |
@Id |
@GeneratedValue詳見以下 |
username(String) |
username(varchar) |
@Column |
name = "username", length = 100 |
time |
time |
@Temporal() |
TemporalType.DATE ..... |
@Entity:將域模型標註爲一個實體,表示需要保存到數據庫中,默認情況下類名即爲表名,通過name屬性顯式指定
表名,如@Entity(name="USER")表示User保存到t_user表中。
@Id :對應的屬性是表的主鍵,
@GeneratedValue:主鍵的產生策略,通過strategy屬性指定。默認情況下,JPA自動選擇一個最適合底層數據庫的
主鍵生成策略,如SqlServer對應identity,MySql對應auto increment。在
javax.persistence.GenerationType中定義了以下幾種可供選 擇的策略:
(1)IDENTITY:表自增鍵字段,Oracle不支持這種方式;
(2) AUTO:JPA自動選擇合適的策略,是默認選項;
(3)SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator註解指定序列名, MySql不
支持這種方式;
(4) TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於數
據庫移植。不同的JPA實現商生成的表名是不同的,如OpenJPA生成
openjpa_sequence_table表Hibernate生成一個hibernate_sequences表,而
TopLink則生成sequence表。這些表都具有一個序列名和對應值兩個字段,
如 SEQ_NAME 和SEQ_COUNT。
@Column(name = "TOPIC_ID"):屬性對應的表字段。我們並不需要指定表字段的類型,因爲JPA會根據反射從實體
屬性中獲取類型;如果是字符串類型,我們可以指定字段長度,以便可以自動生成
DDL語句,如③處所示;
@Temporal(TemporalType.DATE):如果屬性是時間類型,因爲數據表對時間類型有更嚴格的劃分,所以必須指定具
體時間類型,如④所示。
在javax.persistence.TemporalType枚舉中定義了3種時間類型:
1) DATE :等於java.sql.Date
2) TIME :等於java.sql.Time
3) TIMESTAMP :等於java.sql.Timestamp
今天就先寫到這裏,更多學習資料