Spring Data JPA渐进式学习--@Entity等注解的使用

407 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情

1 关于实体类的相关规定

  • 实体必须是数据库的映射对象
  • 实体类必须有一个无参构造方法
  • 持久化映射的注解可以标注在Entity的字段上
  • 只要是@Entity的实体里的字段都会映射到数据库,若是数据库没有,则会报错,@Transient注解的字段除外
  • 实体必须包含一个主键,可以是单个字段也可以是复合主键字段

2 常见注解

2.1 @Entity

用于定义对象,将会成为被JPA管理的实体,必填。

@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
    //这个name可写可不写,写的话需要保证唯一
    String name() default "";
}

2.2 @Table

用于指定表名,表示这个实体对应的数据库表名,非必填。当不填写的时候,将默认是类名,驼峰转下划线。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    //表名
    String name() default "";
    
    String catalog() default "";
    //表所在schema
    String schema() default "";
    //唯一约束,当表不存在,并且由JPA创建的时候使用
    UniqueConstraint[] uniqueConstraints() default {};
    //索引,当表不存在,并且由JPA创建的时候使用
    Index[] indexes() default {};
}

2.3 @Access

用于指定Entity的注解是写在字段上边还是在get/set方法上生效。非必填,不填写的时候会以第一个注解出现在字段上还是get/set上为准。

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Access {
    AccessType value();
}

2.4 @Id

定义属性为数据表的主键,一个实体内必须有一个主键,可以与@GeneratedValue配合使用或者成对出现

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
}

2.5 @GeneratedValue

定义主键的生成策略

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GeneratedValue {
    GenerationType strategy() default GenerationType.AUTO;

    String generator() default "";
}

GenerationType可选以下四个值

public enum GenerationType {
    TABLE,
    SEQUENCE,
    IDENTITY,
    AUTO;

    private GenerationType() {
    }
}

TABLE

通过表生成主键,框架借由表模拟序列产生主键

SEQUENCE

通过序列产生主键,使用@SequenceGenerate指定序列名,但是MySQL不支持这种方式

IDENTITY

采用数据库ID自增,一般用于mysql数据库

AUTO

JPA自己选择合适的策略,默认就是这个选项

2.6 @Enumerated

这个注解对Enum提供了下标和Name两种方式,可以直接映射在Enum枚举类型的字段上。

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Enumerated {
    EnumType value() default EnumType.ORDINAL;
}

value值有两个选项:

public enum EnumType {
    //枚举字段的下表
    ORDINAL,
    //枚举字段的Name
    STRING;

    private EnumType() {
    }
}

2.7 @Basic

表示属性是需要映射到数据库的,当实体的属性没有任何注解的时候,就默认是这个注解,所以实体内的属性默认是全部映射到数据库表的。

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Basic {
    FetchType fetch() default FetchType.EAGER;
        
    boolean optional() default true;
}

2.8 @Transient

表示该属性不用映射到数据库表,JPA进行数据映射的时候,会忽略带有这个注解的字段。

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Transient {
}

2.9 @Column

这个字段可以定义该属性对应数据库表的字段名,当属性名和字段名有差异的时候可以使用。

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String name() default "";

    boolean unique() default false;

    boolean nullable() default true;

    boolean insertable() default true;

    boolean updatable() default true;

    String columnDefinition() default "";

    String table() default "";

    int length() default 255;

    int precision() default 0;

    int scale() default 0;
}

2.10 @Temporal

这个注解用来设置Date类型属性的精度

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Temporal {
    TemporalType value();
}
public enum TemporalType {
    //只有日期
    DATE,
    //只有时间
    TIME,
    //日期加时间
    TIMESTAMP;

    private TemporalType() {
    }
}