SpringDataJPA使用Oracle序列设置值:主键字段、非主键字段

1.前景

项目使用SpringDataJPA+Hibernate+Oracle,使用Oracle序列设置Entity对应的主键值,这个很常见。实现步骤如下:
1>创建一个Oracle序列:

CREATE SEQUENCE morw.SEQ_MERCHANTS_PAY_INFO_ID
INCREMENT BY 1
MAXVALUE 999999999
MINVALUE 1
CACHE 10;

2>在实体中引用:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_MERCHANTS_PAY_INFO_ID")
@SequenceGenerator(name = "SEQ_MERCHANTS_PAY_INFO_ID", sequenceName = "SEQ_MERCHANTS_PAY_INFO_ID")

2.问题

现在同一个Entity实体的,另一个非主键字段也需要使用序列来设置值。后来自己发现:不能在同一个Entity中,通过@GeneratedValue和@SequenceGenerator标签使用多个Oracle序列。

3.解决方案

使用SpringDataJPA的原生sql语句查询序列的下一个值。然后在service层调用此方法获取下一个序列值,手动设置到Entiry的非主键字段上去。

 //获取oracle序列的下一个值,方法返回类型是Long或者String都可正常运行
 @Query(value = "SELECT SEQ_MERCHANTS_PAY_INFO_ID.nextval from DUAL", nativeQuery = true)
 Long findPayIdFromSeq();

参考文章:
1.How do you get a Oracle Sequence value with JPA?
2.SpringDataJPA原生sql语句执行

你可能感兴趣的:(SpringDataJPA使用Oracle序列设置值:主键字段、非主键字段)