一.JPA自带的主键生成策略
JPA自带的主键生成策略有以下四种:
AUTO:主键由程序控制,默认的主键生成策略,能够适应数据库变化,Oracle默认是序列方式,Mysql默认是主键自增长方式。
IDENTITY:主键由数据库自动生成(主要是自动增长型),Mysql支持,Oracle不支持。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列,Oracle支持,Mysql不支持。
TABLE:使用一个特定的数据库表格来保存主键。
使用方式(对于前三种,主键一定要是整型):
AUTO类型:
@Id
@Column(name="ID")
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
SEQUENCE类型:
在数据库中建立了seq_payment序列:
create sequence seq_payment
minvalue 1
start with 1
increment by 1
minvalue 1 nomaxvalue
cache 20;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")
@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")
TABLE类型:
建立存储主键的表:
CREATE TABLE tb_generator (
id NUMBER NOT NULL,
gen_name VARCHAR2(255) NOT NULL,
gen_value NUMBER NOT NULL,
PRIMARY KEY(id)
)
@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
)
注意:如果你使用的是JPA+Hibernate+Oracle,在使用AUTO方式时,一定要新建一个Hibernate_Sequence序列。在使用SEQUENCE方式时,如果没有指定序列,也会默认选择Hibernate_Sequence序列。
二.JPA结合Hibernate主键生成策略
自定义主键生成策略,由@GenericGenerator实现。
hibernate在JPA的基础上进行了扩展,可以用@GenericGenerator引入hibernate的主键生成策略。
对于hibernate主键生成策略和各自的具体生成器之间的关系,在org.hibernate.id.IdentifierGeneratorFactory中指定了。
Java代码:
static {
GENERATORS.put("uuid", UUIDHexGenerator.class);
GENERATORS.put("hilo", TableHiLoGenerator.class);
GENERATORS.put("assigned", Assigned.class);
GENERATORS.put("identity", IdentityGenerator.class);
GENERATORS.put("select", SelectGenerator.class);
GENERATORS.put("sequence", SequenceGenerator.class);
GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
GENERATORS.put("increment", IncrementGenerator.class);
GENERATORS.put("foreign", ForeignGenerator.class);
GENERATORS.put("guid", GUIDGenerator.class);
GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated
GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
}
上面十二种策略,加上native, hibernate一共默认支持十三种生成策略。
下面就uuid生成策略举例说明:
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "GROUP_ID", unique = true, nullable = false, length = 40)
private String id;