【问题标题】:Make @GeneratedValue start a sequence with a specific value使@GeneratedValue 开始一个具有特定值的序列
【发布时间】:2021-10-21 13:36:08
【问题描述】:

我有一个类,它是 PostgreSQL 数据库中表的实体:

@Entity
@Table(name = "users")
public class User {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Getter private Long id;
...
CREATE TABLE IF NOT EXISTS users (
    id BIGSERIAL NOT NULL UNIQUE,
...

当应用程序启动时,该表会填充一些测试数据(来自 .sql 文件的槽“INSERT INTO...”)。但是,当通过 Hibernate 在数据库中创建新实例时,ID 总是以 one 开头,迫使我多次创建它,直到生成的 ID 达到所需的值。

我需要 ID 计数器以数字开头,即比表中上一条记录的 ID 多一个。理想情况下不需要我手动指定 ID 值。

【问题讨论】:

  • 你可以使用@GeneratedValue(strategy = GenerationType.SEQUENCE)
  • @vaibhavsahu 但我必须手动指定序列的值,并且对我拥有的每个实体都这样做。还有其他方法吗?

标签: java hibernate spring-data


【解决方案1】:

你可以这样定义你的实体:

@Entity
@Table(name = "users")
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class User {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
    @Getter private Long id;

然后在您的 .sql 文件中编写如下插入查询:

INSERT INTO users values (select nextval('mySequence'), ...

选择 nextval('mySequence')

将为您提供序列表中的下一个可用值

【讨论】:

  • 谢谢!!这正是我想要的!
【解决方案2】:
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_custom_sequence")
    @SequenceGenerator(name="your_custom_sequence", sequenceName = "MY_CUSTOM_SEQ", allocationSize=1) 

你可以像CREATE SEQUENCE MY_CUSTOM_SEQ MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 20 NOMAXVALUE;这样在sql中定义你的序列

【讨论】:

  • 谢谢!但是是否可以根据先前记录的数量自动设置序列开始的值?
  • 在 Oracle 中,如果您在开发数据库中,您可以手动更新数据库中的序列:SELECT FOOBAR_SEQ.NEXTVAL FROM DUAL; ALTER SEQUENCE FOOBAR_SEQ INCREMENT BY 500; docs.oracle.com/cd/B19306_01/server.102/b14200/…
  • @ErionOmeri 谢谢,对于 Oracle 数据库,这将是解决此问题的好方法!
猜你喜欢
  • 2011-11-14
  • 2013-01-02
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
相关资源
最近更新 更多