JPA基本註解

說明:本文以下註解均是基於hibernate-jpa-2.1-api-1.0.0.Final版本。

1. @Entity

@Entity
public class Student {
    @Id
    private String studentId;
    //省略getter()和setter()
}

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

2.@Table

@Entity
@Table(name="STUDENT")
public class Student {
    //省略此處冗餘代碼
}

    當實體類與其映射的數據庫表名不同名時需要使用 @Table 標註說明,該標註與 @Entity 標註並列使用。

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

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

3.@Id

@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator( name = "hibernate-uuid",strategy = "uuid")
private String id;

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

  3.1 @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方法來判斷的,浮點型的精度太大,不能夠準確的匹配。

  3.2 @GeneratedValue
    標註主鍵的生成策略

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

    需要注意的是,同一張表中自增列最多只能有一列。

  3.3 @GenericGenerator
    自定義主鍵生成策略

屬性名 釋義 默認值
name 生成器名稱 字符串(對應@GeneratedValue註解的generator屬性值)
strategy 具體生成器的類名 見該表下的代碼塊
parameters strategy生成器用到的參數 {}

    主鍵生成策略和各自的具體生成器之間的關係,在org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory中指定如下:

    public DefaultIdentifierGeneratorFactory() {
        this.register("uuid2", UUIDGenerator.class);
        this.register("guid", GUIDGenerator.class);
        this.register("uuid", UUIDHexGenerator.class);
        this.register("uuid.hex", UUIDHexGenerator.class);
        this.register("assigned", Assigned.class);
        this.register("identity", IdentityGenerator.class);
        this.register("select", SelectGenerator.class);
        this.register("sequence", SequenceStyleGenerator.class);
        this.register("seqhilo", SequenceHiLoGenerator.class);
        this.register("increment", IncrementGenerator.class);
        this.register("foreign", ForeignGenerator.class);
        this.register("sequence-identity", SequenceIdentityGenerator.class);
        this.register("enhanced-sequence", SequenceStyleGenerator.class);
        this.register("enhanced-table", TableGenerator.class);
    }

4.@Column

@Column(name = "NAME",columnDefinition = "varchar(158) not null")
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方法或屬性前。

5. @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、java.sql.Time和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”

6.@Transient

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

7. @Basic

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

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

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

    屬性optional表示屬性是否可爲null,不能用於Java基本數據類型byte、int、short、long、boolean、char、float、double的使用。

    對於一些特殊的屬性,比如長文本型text、字節流型blob型的數據,在加載Entity時,這些屬性對應的數據量比較大,有時創建實體時如果也加載的話,可能嚴重造成資源的佔用。要想解決這些問題,此時就需要設置實體屬性的加載方式爲延遲加載(LAZY)。

我的博客即將入駐“雲棲社區”,誠邀技術同仁一同入駐。

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