天天看點

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時生效) 正整數或零
scale 保留小數點後數值位數(類型僅為double時生效) 正整數或零

    提示:此注解可以标注在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)。

我的部落格即将入駐“雲栖社群”,誠邀技術同仁一同入駐。

繼續閱讀