Oracle无主键表用Repository插入新行,ROWID作为Id的问题
解决Oracle无主键表用ROWID作为ID时的插入问题
报错原因
你遇到的IdentityColumnSupportImpl不支持标识键生成错误,是因为GenerationType.IDENTITY策略只适用于数据库中定义为自增类型的列(比如Oracle 12c+的IDENTITY列、MySQL的auto_increment),而ROWID是Oracle自动维护的伪列,不属于这类自增列,所以这个策略完全不适用。
正确解决方案
ROWID是Oracle在插入数据后自动分配的,不需要也不能手动插入,只需修改实体类中ID字段的注解配置,让它不参与插入和更新操作即可:
修改后的实体类代码:
@Id @Column(name = "ROWID", insertable = false, updatable = false) private String id; @Column(name = "phone_number") private String phoneNumber;
配置说明
insertable = false:告诉JPA在执行INSERT语句时,不要把id字段包含进去,避免手动插入ROWID的错误updatable = false:ROWID是Oracle固定维护的,永远不能修改,所以设置为不可更新
这样调用Repository的save()方法时,只会插入phone_number字段,Oracle自动生成对应的ROWID;插入完成后,JPA会自动把生成的ROWID赋值给实体类的id属性,你可以直接从save()返回的对象中获取这个值。
内容的提问来源于stack exchange,提问作者Sara Eva
相关产品推荐
相关产品推荐

