在jpa中,定义主键如下:
@Entity
public class Person {
@Id
// 声明一个策略通用生成器
@GenericGenerator(name = "inc", strategy ="increment")
// 用generator属性指定要使用的策略生成器。
@GeneratedValue(generator = "inc")
private long id;
private String name;
使用一个@Id注解就可以定义一个主键,但主键生成的策略定义却有很多方式:
Jpa的@GeneratedValue直接指定主键策略
使用 Jpa的@GeneratedValue直接指定主键策略 ,如下:
@GeneratedValue(strategy = GenerationType.AUTO)
其中strategy是一个枚举类GenerationType,有如下四种值:
AUTO 持久化层程序会自动选择一个合适的主键生成策略,策略与具体的数据库有关 IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式 SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持 TABLE 提供特定的数据库产生主键, 该方式更有利于数据库的移植
eg:AUTO 类型生成的主键,在mysql中需要程序指定;但在PostgreSQL中,会自动创建一个序列,从序列中获取主键。
Jpa的@GenericGenerator使用主键生成策略
通过以下两步可以指定:
- @GenericGenerator声明一个主键生成策略
- @GeneratedValue 使用这个策略
示例如下:
// 声明一个策略通用生成器 @GenericGenerator(name = "inc", strategy ="increment") // 用generator属性指定要使用的策略生成器。 @GeneratedValue(generator = "inc") private long id;
其中jpa默认的主键生成策略以及其对应的类如下:
"uuid2", UUIDGenerator.class "guid", GUIDGenerator.class "uuid", UUIDHexGenerator.class "uuid.hex", UUIDHexGenerator.class "assigned", Assigned.class "identity", IdentityGenerator.class "select", SelectGenerator.class "sequence", SequenceStyleGenerator.class "seqhilo", SequenceHiLoGenerator.class "increment", IncrementGenerator.class "foreign", ForeignGenerator.class "sequence-identity", SequenceIdentityGenerator.class "enhanced-sequence", SequenceStyleGenerator.class "enhanced-table", TableGenerator.class