JPA 注解
1. 基本注解
-
@Entity
- 用于类声明之前,表明该 java 类是一个实体类,将映射到指定的数据库表
-
@Table:详情参照大佬的github
- 当实体类与其映射的数据库表名不同的时候需要使用@Table注解说明。
- 该注解通常与@Entity一起使用
- 常用属性:一般只需要指定name即可
- name:数据库的表名。默认为类名
- catalog:设置数据表所属的数据库目录,默认为数据库系统缺省的 catalog
- schema:设置数据表所属的数据库模式,默认为用户缺省的 schema。catalog和schema的区别
- uniqueConstraints:表的唯一约束(除了由
@Column
和@JoinColumn
注解指定的约束以及主键的约束之外的约束),通过使用@UniqueConstraint
注解来声明,仅在允许自动更新数据库表结构的场景中起到作用,默认没有其他额外的约束条件。 - indexes:表的索引,通过使用
@Index
注解来声明,仅在允许自动更新数据库表结构的场景中起到作用,默认没有其他额外的索引。
-
@Id
- 用在属性(字段)上,表明该属性|字段是表的主键列
- 也可以用在getter上
-
@GeneratedValue:详情参照大佬的github
- 标注在有@Id注解的字段上,用于标注主键的生成策略。默认AUTO
- 可选值:根据需求指定,一般只需要指定strategy
- strategy
- GenerationType.IDENTITY 自增,多数数据库支持: MySQL,SQL Server,DB2,Derby,Sybase,PostgreSQL
- GenerationType.SEQUENCE 使用序列作为主键生成策略,支持的数据库: Oracle、PostgreSQL、DB2
- GenerationType.TABLE 在数据库中新建序列表来生成主键,使用该策略更易于数据库移植,但是建议不要优先使用
- GenerationType.AUTO 把主键生成策略交给JPA厂商,由它根据具体的数据库选择合适的策略,默认值
- strategy
- generator:
- 主键生成器的名称。该名称为
@TableGenerator
或@SequenceGenerator
注解中 name 参数的值。默认为持久化提供者(如 Hibernate)提供的id生成器。
- 主键生成器的名称。该名称为
-
@Basic:一般不用
- 表示一个简单属性到数据库表的映射,对于没有任何标注的属性,默认即为@Basic
- 可选值
- fetch:读取策略,有 EAGER 和 LAZY 两种,分别表示立即加载和懒加载
- optional:表示该属性是否允许为 null 值,默认为true
-
@Column
-
设置生成的数据表的属性
-
可选值:根据需要制定即可
- name:列(字段)名。默认为属性名
- unique:是否唯一,默认false。唯一约束
- nullable:是否允许为空,默认为true。非空约束
- insertable:列是否包含在 insert 语句中,默认为true
- updatable:列是否包含在
UPDATE
语句中,默认为 true - columnDefinition:创建表时该属性在数据库中的类型。默认使用推断的类型作为数据库中的类型
- table:当前列所属的表的名称
- length:列的长度,仅对字符串类型的列生效。默认为255
- precision:列的精度,仅对十进制数值有效,表示有效数值的总位数。默认为0
- scale:列的精度,仅对十进制数值有效,表示小数位的总位数。默认为0
-
注意:
-
precision 和 scale 对
BigDecimal
有效,对Double
无效,Double
类型需要手动指定类型: -
@Column(columnDefinition = "double(8,2)") private Double doubleField;
-
-
2. 其他注解
-
@Transient
- 该注解标注的属性不会映射到数据库中
-
@Temporal
- 用来调整日期类型的精度
- 取值
- TemporalType.DATE:创建表的时候,MySql中的类型是 date
- TemporalType.TIME:创建表的时候,MySql中的类型是 time
- TemporalType.TIMESTAMP:创建表的时候,MySql中的类型是 datetime
-
@MappedSuperclass
:详见大佬的github -
补充:
-
GenerationType.SEQUENCE 和 GenerationType.TABLE 通常分别与注解 @SequenceGenerator 和 @TableGenerator 一起使用,这两个注解都是创建了一张新的表,下面是 @TableGenerator 的示例
-
@Id @TableGenerator( name = "tableId", // name属性规定该注解的名字,方便 GeneratedValue 的 generator 引用 table = "t_id", // 创建的表名 allocationSize = 1, // 每次增加多少。默认50 initialValue = 1, // id的初始值.默认0 pkColumnName = "pk_name", // t_id中表示主键的列名 pkColumnValue = "pk_value", // t_id中表示主键的值的列名 valueColumnName = "user_id") // 这张表要以哪条记录为参考, // 即表示下面的id以 t_id 表中的 user_id 这条记录为参考生成主键 @GeneratedValue(strategy = GenerationType.TABLE, generator = "tableId") private Long id;
-
本节代码:点击此处