Spring Data JPA 常用注解详细说明
1、@Entity
Entity 说明这个class 是实体类,并且使用默认的orm 规则,即 class 名对应数据库表中的表明,class 字段名即表中的字段名。
如果想要改变这种默认的orm 规则,就要使用 @Table 来改变 class 名与数据库中表名的映射规则,@Column 来改变class 中字段与 db 中表的字段名的映射规则。
元数据属性说明:
name:表名
下面的示例说明,Custommer 类对应数据库中的 Custommer 表,其中name 为可选,缺省类名即表名!
@Entity(name=”Customer”)
public class Customer { ... }
2、@Table
Table 用来定义 entity 主表的name 、catalog 、schema 等属性。
元数据属性说明:
name : 表名
catalog:对应关系数据库中的 catalog
schema:对应关系数据库中的 schema
UniqueConstraints:定义一个UniqueConstraint 数组,指定需要建唯一的约束的列。
schema与catalog的理解
sql环境中Catalog和Schema都属于抽象概念,主要用来解决命名冲突问题。一个数据库系统包含多个Catalog,每个Catalog包含多个Schema,每个Schema包含多个数据库对象(表、视图、字段等)。
数据库的完全限定名称可以为 Catalog名称.Schema名称.表名称。
UniqueConstraint的理解
定义在Table或SecondaryTable元数据里,用来指定建表时需要建唯一约束的列。
元数据属性说明: columnNames:定义一个字符串数组,指定要建唯一约束的列名。
联合约束:
@Entity
@Table(name="tbl_sky",
uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})})
单一字段约束:
@Entity
@Table(name="tbl_sky",
uniqueConstraints = {@UniqueConstraint(columnNames="month")})
3、@Id
@Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。@Id标注也可置于属性的getter方法之前。
元数据属性说明:
• generate():主键值的获取类型
• generator():TableGenerator的名字(当generate=GeneratorType.TABLE才需要指定该属性)
@Table(name="CUSTOMERS") @Entity public class Customer { @GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id
4、@GeneratedValue
@GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略。
GeneratedValue推荐两种写法:
第一种,写在属性之上:
@Table(name="CUSTOMERS") @Entity public class Customer { @GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; private String name; private String email; private int age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; }
第二种,写在getter方法之上:
@Table(name="CUSTOMERS") @Entity public class Customer { private Integer id; private String name; private String email; private int age; @GeneratedValue(strategy=GenerationType.AUTO) @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; }
GenerationType :
JPA提供的四种标准用法为 TABLE,SEQUENCE,IDENTITY,AUTO。
- TABLE:使用一个特定的数据库表格来保存主键。
- SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
- IDENTITY:主键由数据库自动生成(主要是自动增长型)
- AUTO:主键由程序控制。
(1)、TABLE:
@Id @GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen") @TableGenerator(name = "pk_gen", table="tb_generator", pkColumnName="gen_name", valueColumnName="gen_value", pkColumnValue="PAYABLEMOENY_PK", allocationSize=1 )
在主键生成后,这条记录的value值,按allocationSize递增。
@TableGenerator 定义如下:
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface TableGenerator { String name(); String table() default ""; String catalog() default ""; String schema() default ""; String pkColumnName() default ""; String valueColumnName() default ""; String pkColumnValue() default ""; int initialValue() default 0; int allocationSize() default 50; UniqueConstraint[] uniqueConstraints() default {}; }
@TableGenerator属性说明如下:
- name :属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值。
- table: 属性表示表生成策略所持久化的表名,例如,这里表使用的是数据库中的“tb_generator”。
- catalog 属性和 schema属性具体指定表所在的目录名或是数据库模式名。
- pkColumnName: 属性的值表示在持久化表中,该主键生成策略所对应键值的名称。例如在“tb_generator”中将“gen_name”作为主键的键值。
- valueColumnName: 属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。例如,在“tb_generator”中将“gen_value”作为主键的值。
- pkColumnValue: 属性的值表示在持久化表中,该生成策略所对应的主键。例如在“tb_generator”表中,将“gen_name”的值为“CUSTOMER_PK”。
- initialValue: 表示主键初始值,默认为0。
- allocationSize: 表示每次主键值增加的大小。例如设置成1,则表示每次创建新记录后自动加1,默认为50。
- UniqueConstraint: 与@Table标记中的用法类似。
(2)、SEQUENCE
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq") @SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment") @SequenceGenerator定义如下: @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface SequenceGenerator { String name(); String sequenceName() default ""; int initialValue() default 0; int allocationSize() default 50; }
以上属性说明如下:
- name: 属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
- sequenceName: 属性表示生成策略用到的数据库序列名称。
- initialValue: 表示主键初识值,默认为0。
- allocationSize: 表示每次主键值增加的大小。例如设置成1,则表示每次创建新记录后自动加1,默认为50。
(3)、IDENTITY
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
(4)、AUTO
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
在指定主键时,如果不指定主键生成策略,默认为AUTO。
5、@Basic
@Basic 是实体类与数据库字段映射时最简单的类型。它可以用于持久类属性或实例变量(instance variable)上,类型包含java基本类型(byte,short,int,long,float,double,char,boolean),包装类,枚举类,以及实现了Serializable接口的类型。
@basic注解有两个属性:
FetchType fetch() default EAGER;
boolean optional() default true;
fetch用来指定属性的加载机制
有两个选项:EAGER(即时加载,默认值)和LAZY(懒加载),即时加载意味着当实例化对象的时候必须加载该属性值,懒加载是指当实例化对象时不加载该属性,只有当调用该属性时才加载.
optional用来指定属性是否可空
有两个选项:true(可空,默认值)和false
如果你在实体类属性上不加@Basic注解,它也会自动加上@Basic,并使用默认值。
6、@Column
Column元数据定义了映射到数据库的列的所有属性:列名,是否唯一,是否允许为空,是否允许更新等。
元数据属性说明: • name:列名。 • unique: 是否唯一 • nullable: 是否允许为空 • insertable: 是否允许插入 • updatable: 是否允许更新 • columnDefinition: 定义建表时创建此列的DDL
• secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
public class Person { @Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true) private String name; @Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO") private byte[] picture;
columnDefinition可以指定创建表时一些SQL语句,比如这里可以一次性指定,varchar长度128,且不能为空 . 当然,相同的结果可以通过nullable和length属性结合实现。
@Table(name = "CUSTOMERS") @Entity public class Customer { @Column(name = "ID") @GeneratedValue(strategy = GenerationType.AUTO) @Id private Integer id; @Column(name = "Name") private String name; @Column(name = "Email", nullable = true, length = 128) private String email; @Column(name = "Age") private int age; ...... }
columnDefinition属性的特殊使用: 编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型 但是String类型默认映射的数值类型是varchar,columnDefinition可以进行额外指定。
@Table(name = "CUSTOMERS") @Entity public class Customer { @Column(name = "ID") @GeneratedValue(strategy = GenerationType.AUTO) @Id private Integer id; @Column(name = "Name") private String name; @Column(name = "Email", nullable = true, length = 128) private String email; @Column(name = "Age") private int age; @Column(name = "Remark",columnDefinition="text") private String remark; ...... }
7、@IdClass
当entity class 使用复合主键时,需要定义一个类作为id class。
id class 必须符合以下要求:
类必须声明为public , 并提供一个声明为public 的空构造函数。
必须实现Serializable 接口,覆写 equals() 和 hashCode()方法。
entity class的所有id field在id class都要定义,且类型一样。
元数据属性说明:
value: id class的类名
public class EmployeePK implements java.io.Serializable{ String empName; Integer empAge; public EmployeePK(){} public boolean equals(Object obj){ ......} public int hashCode(){......} } @IdClass(value=com.acme.EmployeePK.class) @Entity(access=FIELD) public class Employee { @Id String empName; @Id Integer empAge; }