说明:本文以下注解均是基于hibernate-jpa-2.1-api-1.0.0.Final版本。
一、 @Entity
@Entity
public class Student {
@Id
private String studentId;
//省略getter()和setter()
}
说明这个类是实体类,并且使用默认的 ORM 规则(类名即表名,类属性名即表字段名)。
如果想改变这种默认的 ORM 规则,就要使用 @Table 来改变 class 名与表名的映射规则,@Column 来改变 class 中字段名与 db 中表的字段名的映射规则。
仅使用 @javax.persistence.Entity 和 @javax.persistence.Id 这两个注解,就可以作为一个实体类与数据库中的表相对应。
二、@Table
@Entity
@Table(name="STUDENT")
public class Student {
//省略此处冗余代码
}
当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用。
属性名 | 释义 | 值 | 默认值 |
---|---|---|---|
name | 指定数据库表名称 若不指定则以实体类名称作为表名 | 字符串 | “” |
schema | 指定该实体映射的schema | 字符串 | “” |
catalog | 与 schema 属性相同 | 字符串 | “” |
indexes | 索引 | @Index | {} |
uniqueConstraints | 唯一约束 | @UniqueConstraint | {} |
当实体类名和数据库表名不一致时,name 属性可以实现映射,即使表名一致,也推荐使用,提高程序的可读性 。
三、@Id
@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator( name = "hibernate-uuid",strategy = "uuid")
private String id;
标记属性的主键(一个实体中可以出现多个 @Id 注解,但需要 @IdClass 配合使用,以表示联合主键)。
一旦标注了主键,该实体属性的值可以指定,也可以根据一些特定的规则自动生成。
3.1 @Id 标识数据类型
分类 | 类型 |
---|---|
基本数据类型 | byte、int、short、long、char |
基本数据类型的封装类 | 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 生成器用到的参数 | {} |
主键生成策略和各自的具体生成器之间的关系,在 DefaultIdentifierGeneratorFactory 中指定如下:
package org.hibernate.id.factory.internal;
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);
}
四、@Column
@Column(name = "NAME", columnDefinition = "varchar(158) not null")
private String name;
标识实体类中属性与数据表中字段的对应关系。
属性名 | 释义 | 值 | 默认值 |
---|---|---|---|
name | 所对应表字段的名称 | string | “” |
unique | 是否为唯一标识(亦可在 @Table 注解中设置) | boolean | false |
nullable | 是否可为 null 值 | boolean | true |
insertable | 在使用 insert 时,是否插入该字段的值 | boolean | true |
updatable | 在使用 update 时,是否更新该字段的值 | boolean | true |
columnDefinition | 通过 Entity 生成 DDL 语句 | string | “” |
table | 包含当前字段的表名 | string | “” |
length | 字段长度(类型仅为 varchar 时生效) | integer | 255 |
precision | 数值的总长度(类型仅为 double 时生效) | integer | 0 |
scale | 保留小数点后数值位数(类型仅为 double 时生效) | integer | 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、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” |
六、@Transient
一旦变量被 transient 修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问(即:不与表字段映射)。
常用于某属性仅为临时变量时。
七、@Basic
@Basic(fetch = FetchType.LAZY)
@Column(name = "CONTENT")
private String content;
表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的属性,默认即为 @Basic。
属性名 | 释义 | 值 | 默认值 |
---|---|---|---|
fetch | 加载方式 | FetchType.EAGER - 即时加载 FetchType.LAZY - 延迟加载 | FetchType.EAGER |
strategy | 是否可为 null | boolean | true |
属性 optional 表示属性是否可为 null,不能用于 Java 基本数据类型 byte、int、short、long、boolean、char、float、double 的使用。
对于一些特殊的属性,比如长文本型 text、字节流型 blob 型的数据,在加载 Entity 时,这些属性对应的数据量比较大,有时创建实体时如果也加载的话,可能严重造成资源的占用。要想解决这些问题,此时就需要设置实体属性的加载方式为延迟加载(LAZY)。