在 Spring Boot 实体中管理字符串 ID 序列

Manage String id sequence in spring boot entity

提问人:Ayoub Hammami 提问时间:3/25/2020 最后编辑:Sariq ShaikhAyoub Hammami 更新时间:10/9/2023 访问量:3392

问:

我正在研究 oracle 数据库以管理具有字符串主键的 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;

但是在持久化一个新实体时,我收到错误: ids 的未知整数数据类型:java.lang.String 有人可以帮我吗?

Oracle 休眠 spring-boot JPA 序列

评论


答:

0赞 Sunshine 3/25/2020 #1

尝试删除@GeneratedValue和@SequenceGenerator 此外,将自动设置备注,@Id以便您可以将它们从@Column中删除。unique=true, nullable = false,updatable = false

否则,您可以查看本文,了解有关创建自定义字符串生成器的更多详细信息 https://vladmihalcea.com/how-to-implement-a-custom-string-based-sequence-identifier-generator-with-hibernate/

评论

0赞 Ayoub Hammami 3/25/2020
谢谢,但是如果我按照您的要求进行操作,我会遇到错误ORA-01400:无法在id中插入NULL
0赞 Ayoub Hammami 3/25/2020
我删除了两行: @SequenceGenerator(name=“SEQ_ID”, sequenceName = “SEQ_ID” ) @GeneratedValue(strategy=GenerationType.SEQUENCE, generator=“SEQ_ID”)
0赞 Sunshine 3/25/2020
好的,删除它们后,尝试添加您的实体代码,但您必须处理生成相同的 id 异常。否则,您可以按照上述教程进行操作。@PrePersist private void ensureId(){ this.setId(UUID.randomUUID().toString()); }
0赞 pranit patil 4/28/2023 #2

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

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;

}