JPA基本注解

说明:本文以下注解均是基于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具体生成器的类名见该表下的代码块
parametersstrategy 生成器用到的参数{}

 主键生成策略和各自的具体生成器之间的关系,在 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 注解中设置)booleanfalse
nullable是否可为 null 值booleantrue
insertable在使用 insert 时,是否插入该字段的值booleantrue
updatable在使用 update 时,是否更新该字段的值booleantrue
columnDefinition通过 Entity 生成 DDL 语句string“”
table包含当前字段的表名string“”
length字段长度(类型仅为 varchar 时生效)integer255
precision数值的总长度(类型仅为 double 时生效)integer0
scale保留小数点后数值位数(类型仅为 double 时生效)integer0

提示:此注解可以标注在 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是否可为 nullbooleantrue

 属性 optional 表示属性是否可为 null,不能用于 Java 基本数据类型 byte、int、short、long、boolean、char、float、double 的使用。

 对于一些特殊的属性,比如长文本型 text、字节流型 blob 型的数据,在加载 Entity 时,这些属性对应的数据量比较大,有时创建实体时如果也加载的话,可能严重造成资源的占用。要想解决这些问题,此时就需要设置实体属性的加载方式为延迟加载(LAZY)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值