JPA基礎(三)之註解

JPA 的基本註解

基於 hibernate-jpa-2.1-api-1.0.0.Final 版本

@Entity

@Entity
public class Student {
}
說明這個類是實體類,並且使用默認的 orm 規則(類名即表名,類屬性名即表字段名)。
如果想改變這種默認的 orm 規則,就要使用@Table 來改變 class 名與表名的映射規則,@Column 來改變 class 中字段名與 db 中表的字段名的映射則。
僅使用 @Entity 和 @Id 這兩個註解,就可以作爲一個實體類與數據庫中的表相對應。

@Table

@Entity
@Table(name=“STUDENT”)
public class Student {
//省略此處冗餘代碼
}
當實體類與其映射的數據庫表名不同名時需要使用 @Table 標註明,該標註與 @Entity 標註並列使用。

屬性名 釋義 默認值
name 指定數據庫表名稱若不指定則以實體類名稱作爲表名 字符串 “”
schema 指定該實體映射的schema 字符串 “”
catalog 與 schema 屬性相同 字符串 “”
indexes 索引 @Index {}
uniqueConstraints 唯一約束 @UniqueConstraint {}

當實體類名和數據庫表名不一致時,name 屬性可以實現映射,即使表名一致,也推薦使用,提高程序的可讀性

@Id

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY )
private String id;

標記屬性的主鍵(一個實體中可以出現多個@Id 註解,但需要@IdClass配合使用,以表示聯合主鍵)。一旦標註了主鍵,該實體屬性的值可以指定,也可以根據一些特定的規則自動生成。

@Id 標識數據類型

分類 類型
Java 基本數據類型 byte、int、short、long、char
Java 基本數據類型對應的封裝類 Byte、Integer、Short、Long、Character
大數值型類 java.math.BigInteger
字符串類型 String
時間日期型 java.util.Date、java.sql.Date

double 和 float 浮點類型和它們對應的封裝類不能作爲主鍵,這是因爲判斷是
否 唯 一 是 通 過 equals 方 法 來 判 斷 的 , 不 能 夠 準 確 的 匹 配 。

@GeneratedValue

標註主鍵的生成策略

屬性名 釋義 默認值
strategy 主鍵的生成策略 GenerationType.TABLE 通過表產生主鍵,框架藉由表模擬序列產生主鍵GenerationType.SEQUENCE 通過序列產生主鍵(不支持MySql)GenerationType.IDENTITY 自增長(不支持 Oracle)GenerationType.AUTO 自動選擇合適的策略 GenerationType.AUTO
generator 自定義生成策略 字符串(對應@GenericGenerator 註解的name 屬性值) “”

需要注意的是,同一張表中自增列最多隻能有一列,GenerationType.SEQUENCE在 oracle 數據庫時使用,配合@SequenceGenerator 指定使用哪個序列名
@SequenceGenerator(name=“teaSEQ”,sequenceName=“teaSEQ_DB”)
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator=“teaSEQ”)

Column

@Column(name = “NAME”,columnDefinition = "varchar(158))
private String name;

標識實體類中屬性與數據表中字段的對應關係。

屬性名 釋義 默認值
name 所對應表字段的名稱 字符串 “”
unique 是否爲唯一標識(亦可在@Table 註解中設置) 布爾值 false
nullable 是否可爲 null 值 布爾值 true
insertable 在使用’insert’時,是否插入該字段的值 布爾值 true
updatable 在使用’update’時,是否更新該字段的值 布爾值 true
columnDefinition 通過 Entity 生成 DDL語句 字符串 “”
table 包含當前字段的表名 字符串 “”
length 字段長度(類型僅爲varchar 時生效) 正整數或零 255
precision 數值的總長度(類型僅爲 double 時生效) 正整數或零 0
scale 保留小數點後數值位數(類型僅爲 double時生效) 正整數或零 0

提示:此註解可以標註在 getter 方法或屬性前

@Temporal

@Temporal(TemporalType.TIMESTAMP)
private Date createTime;

指 明 該 屬 性 獲取 時 間 精度 。 默 認 爲 TemporalType.TIMESTAMP 類型。
TemporalType 枚舉類型定義如下:
public enum TemporalType {
DATE, //java.sql.Date
TIME, //java.sql.Time
TIMESTAMP //java.sql.Timestamp
}
它們表示時間的精確度不同。三者的區別如表所示。

類型 說明
java.sql.Date 日期型,精確到年月日,例如“2008-08-08”
java.sql.Time 時間型,精確到時分秒,例如“20:00:00”
java.sql.Timestamp 時間戳,精確到納秒,例如“2008-08-08 20:00:00.000000001”

@Transient

一旦變量被 transient 修飾,變量將不再是對象持久化的一部分,該變量內容在序列化後無法獲得訪問(即:不與表字段映射)。常用於某屬性僅爲臨時變量時。

@Basic

@Basic(fetch = FetchType.LAZY)
@Column(name = “CONTENT”)
private String content;

表示一個簡單的屬性到數據庫表的字段的映射,對於沒有任何標註的屬性,默認
即爲 @Basic。

屬性名 釋義 默認值
fetch 加載方式 FetchType.EAGER 即時加載FetchType.LAZY 延遲加載 FetchType.EAGER
optional 是否可爲null 布爾值 true

屬性 optional 表示屬性是否可爲 null,不能用於 Java 基本數據類型 byte、int、short、long、boolean、char、float、double 的使用。
對於一些特殊的屬性,比如長文本型 text、字節流型 blob 型的數據,在加載 Entity 時,這些屬性對應的數據量比較大,有時創建實體時如果也加載的話,可能嚴重造成資源的佔用。要想解決這些問題,此時就需要設置實體屬性的加載方式爲延遲加載(LAZY)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章