当前位置: 首页 > 知识库问答 >
问题:

Liquibase Postgresql Spring Jpa:Id自动递增问题

卢阳泽
2023-03-14

我在实体中有以下Id描述:

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;

生成此id的分解指令如下:

  <column name="id" autoIncrement="true"  type="INT">
     <constraints nullable="false" primaryKey="true" primaryKeyName="pk_entity"/>
  </column>

此外,我还有一些分解脚本,可以在此表中插入预定义的值,例如。

    <insert tableName="entityTable" schemaName="public">
        <column name="id">1</column>    
        <!- other fields-->
    </insert>

当我尝试使用Jpa存储库插入没有id的新记录时,问题出现了。我收到了一条类似“重复id”的错误消息。所以,我知道jpa(hibernate)不使用postgresql序列来获取新的id值。我不想在实体的id描述中包含序列名。我希望postgresql本身能够解决这种情况。我不会使用“hibernate\u序列”。那么,你知道我如何解决这个问题吗。非常感谢。

共有2个答案

齐承泽
2023-03-14

首先创建表名示例:

CREATE TABLE TABLE_NAME(ID_NAME SERIAL PRIMARY KEY NOT NULL);

然后在您的注释中:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long nameAtribute;
殷永嘉
2023-03-14

Liquibase的指令为PostgreSQL生成串行列。对于序列,PostgreSQL将创建一个名为tablename\u colname\u seq的序列。默认列值将从此序列中分配。

但当您显式地将一个值插入序列列时,它不会影响序列生成器,并且它的下一个值不会更改。因此它可以生成一个重复值,这正是您的情况。

为了防止在插入显式值后出现这种情况,需要使用ALTER sequence语句或setval()函数更改序列生成器的当前值,例如:

ALTER SEQUENCE tablename_colname_seq RESTART WITH 42;

SELECT setval('tablename_colname_seq', (SELECT max(colname) FROM tablename));

这应该可以解决问题。

 类似资料:
  • 问题内容: 我的架构看起来像这样: 我已经在同一数据库中创建了counters集合,并添加了一个带有’entityId’的_id的页面。从这里我不确定如何使用猫鼬来更新该页面并获取递增编号。 没有计数器的架构,我希望它保持这种状态,因为这实际上不是应用程序使用的实体。仅应在模式中使用它来自动递增字段。 问题答案: 这是一个示例,如何在Mongoose中实现自动增量字段:

  • 本文向大家介绍MySql数据库自动递增值问题,包括了MySql数据库自动递增值问题的使用技巧和注意事项,需要的朋友参考一下 在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据列自增属性。 ISAM表 如果把一个NULL插入到一个AUTO_INC

  • 问题内容: 我有一个使用hibernate和注解的j2ee应用程序。我如何注释我的pojo类中的Id字段以将其设置为自动增量或自动生成。在添加bean时,我是否将该字段留在bean中为null? 问题答案: 并在保留时将其保留为。(如果使用包装器) 在某些情况下,该策略被解析为或,因此你可能需要手动将其设置为(取决于基础数据库)。 似乎+ 指定序列名称对你有用。

  • 问题内容: 使用MySQL(特别是5.0)有没有办法让auto_increment字段的值基于分组列? 例: 我不想通过任何“疯狂”的方法来达到这个目的,但是如果需要的话。 问题答案: 对于MyISAM和BDB表,您可以将auto_increment字段作为键的次要部分,例如 这是手册对此所说的 在这种情况下,将为AUTO_INCREMENT列生成的值计算为MAX(auto_increment_c

  • 问题内容: 我现在正在一家公司中使用全球DBA的无限智慧,他创建了一个表,该表将一个int用作ID字段,但是不会自动递增该数字。 我要从.Net传递一个表值参数,因为它随时有大约100或更多行的数据正在传递,并且我不想杀死该应用程序,破坏网络或SQL Server。 这是我的存储过程 我希望这会为我带来一些帮助,就像我对此进行测试时一样 这就是我回来的 (影响1行) (影响1行) (影响1行) (

  • 我在下面的代码中创建了一个表: 此外,我有记录从csv文件导入到表。我想插入一个新的记录到表我一直得到这个错误 错误:重复的键值违反了唯一约束"salesorderdetail_pkey"DETAIL: Key(SalesorderDetid)=(2)已经存在。********** 错误 ********** 错误:重复的键值违反唯一约束“salesorderdetail_pkey”SQL状态:2