oracle 管理Sping Boot 实体中的String id序列

jmo0nnb3  于 2023-04-29  发布在  Oracle
关注(0)|答案(2)|浏览(118)

我正在使用Oracle数据库来管理一个带有String主键的JPA实体。我不能在数据库中将PK上的类型修改为Long或int,所以我想知道如何在我的JPA实体中配置pk序列,我已经尝试过了:

@Id
@SequenceGenerator(name="SEQ_ID", sequenceName = "SEQ_ID" )
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_ID")
@Column(name="SEQ_ID",unique=true, nullable = false,updatable = false)
private String id;

但是当持久化一个新的实体时,我得到了一个错误:id的未知整数数据类型:有人能帮帮我吗?

kqhtkvqz

kqhtkvqz1#

尝试删除@GeneratedValue和@SequenceGenerator另外,一个注解@Id将自动设置unique=true, nullable = false,updatable = false,因此您可以从@Column中删除它们。
否则,您可以查看本文以获取有关创建自定义字符串生成器https://vladmihalcea.com/how-to-implement-a-custom-string-based-sequence-identifier-generator-with-hibernate/的更多详细信息

p8ekf7hl

p8ekf7hl2#

您必须编写自定义序列字符串生成器类,并将该类添加为@GenericGenerator的stratergy,如下所示

public class foo implements IdentifierGenerator{

@Override
public Serilizable generate(SharedSessioContractImplementor session, Object object){
return session.createSQLQuery(select foo_seq_name.nextval from all_sequences where SEQUENCE_NAME='foo_seq_name').getSingleResult().toString;
}

实体类应该如下所示:

@Id
@GenericGenerator(name="seq_id" strategy = "foo")
@GeneratedValue(generator="seq_id")
private String foo_id;

}

相关问题