携手创作,共同成长!这是我参与「掘金日新计划 · 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() {
}
}