天天看点

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)。

我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。

继续阅读