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语句执行