【问题标题】:Autoincrement does not work PostgreSQL - Java EE APP自动增量不起作用 PostgreSQL - Java EE APP
【发布时间】:2018-12-14 09:28:16
【问题描述】:

我有一个应用程序,其中我有 PK Id 的自动增量。我必须添加其他自动增量列,并使用 liquibase 使其工作 - liquibase 创建了自动增量序列。当我从查询工具进行插入或当我不在实体中映射该字段并使持久自动增量起作用时。但是当我添加:

@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "next_value", nullable=false, unique=true)
private Long nextValue;

我收到一个丑陋的错误:

Caused by: org.postgresql.util.PSQLException: ERROR: empty value in the "next_value" column violates the limit of the required value

这里有什么问题?

编辑:

我的 liquibase 变更集添加此列并使其自动递增:

<addColumn tableName="table">
      <column name="next_value" type="number"/>
    </addColumn>
<addAutoIncrement
        columnDataType="number"
        columnName="next_value"
        incrementBy="1"
        startWith="1"
        tableName="table"/>
<sql>select setval('table_next_value_seq', (select cast(current_value+1 as bigint) from gapless_sequence), false)</sql>

setval 不是从 1 开始的

【问题讨论】:

  • edit您的问题并为相关表格添加create table声明。
  • IDENTITY 并不意味着序列。这意味着在数据库中生成的列...例如 AUTO_INCREMENT 或 SERIAL。不发布您的架构是什么使问题猜测......
  • @BillyFrost: Postgres 中的identity 列是使用序列实现的(与serial 列相同)
  • 如何在数据库内部“实现”某些东西超出了 JPA 的范围。 JPA 提供者将需要一个 IDENTITY COLUMN,结束。直到 OP 为他们的表发布 DDL,并且在插入时调用了什么 SQL,这一切都毫无意义

标签: java postgresql jpa jakarta-ee


【解决方案1】:

你必须禁用可插入和可更新的 false

@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "next_value", unique = true, nullable = false, insertable = false,updatable = false)

【讨论】:

    【解决方案2】:

    我猜它应该改变数据库中的表

    ALTER TABLE tblName(
    nextValue LONG NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
    

    ....

    【讨论】:

      猜你喜欢
      • 2020-03-30
      • 2015-11-22
      • 2013-05-25
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 2017-03-09
      • 1970-01-01
      相关资源
      最近更新 更多