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)。