JPA 自带的主键策略有 4 种,在枚举 javax.persistence.GenerationType 中,分别是:TABLE、SEQUENCE、IDENTITY、AUTO。
TABLE:
通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。不同的JPA实现商生成的表名是不同的,如OpenJPA生成openjpa_sequence_table表,Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。
SEQUENCE
表示使用数据库的序列为新增加的实体对象赋唯一值。这种情况下需要数据库提供对序列的支持常用的数据库中,Oracle支持,MySQL不支持这种方式。
IDENTITY
JPA 容器将使用数据库的自增长字段为新增加的实体对象赋唯一值。这种情况下需要数据库提供对自增长字段的支持,SQL Server、MySQL、DB2、Derby等支持。数据库在insert时分配标识值。Oracle不支持这种方式。
AUTO
由JPA自动生成,默认,委托JPA实现负责产生字段值。JPA会自动选择一个最适合底层数据库的主键生成策略。如MySQL会自动对应auto increment。这个是默认选项,即如果只写@GeneratedValue,等价于@GeneratedValue(strategy=GenerationType.AUTO)。
如果使用Hibernate对JPA的实现,可以使用Hibernate对主键生成策略的扩展,通过Hibernate的@GenericGenerator实现。
示例:
1
2
3
4
5
6
7
|
@Id //用generator属性指定要使用的策略生成器。 @GeneratedValue (generator = "system-uuid" ) //声明一个策略通用生成器,name为”system-uuid”,策略strategy为”uuid”。 @GenericGenerator (name = "system-uuid" , strategy = "uuid" ) @Column (name= "uuid" , length= 32 ) private String uuid; |