JPA主键生成策略

一.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;




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值