說明:本文以下注解均是基于hibernate-jpa-2.1-api-1.0.0.Final版本。
1. @Entity
@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
@Table
@Entity
@Table(name="STUDENT")
public class Student {
//省略此處備援代碼
}
當實體類與其映射的資料庫表名不同名時需要使用 @Table 标注說明,該标注與 @Entity 标注并列使用。
屬性名 | 釋義 | 值 | 預設值 |
name | 指定資料庫表名稱 若不指定則以實體類名稱作為表名 | 字元串 | “” |
schema | 指定該實體映射的schema | 字元串 | “” |
catalog | 與schema屬性相同 | 字元串 | “” |
indexes | 索引 | @Index | {} |
uniqueConstraints | 唯一限制 | @UniqueConstraint | {} |
當實體類名和資料庫表名不一緻時,name屬性可以實作映射,即使表名一緻,也推薦使用,提高程式的可讀性 。
3. @Id
@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
@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
@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
一旦變量被transient修飾,變量将不再是對象持久化的一部分,該變量内容在序列化後無法獲得通路(即:不與表字段映射)。
常用于某屬性僅為臨時變量時。
7. @Basic
@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)。
我的部落格即将入駐“雲栖社群”,誠邀技術同仁一同入駐。