【问题标题】:Postgresql throws null value in column "id" violates not-null constraint for GenerationType.IDENTITYPostgresql 在“id”列中抛出空值违反了 GenerationType.IDENTITY 的非空约束
【发布时间】:2021-01-15 12:00:02
【问题描述】:

我正在尝试为我的实体自动生成 ID:

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

我的DB表是通过flyway脚本创建的,列ID设置为IDENTITY

CREATE TABLE USERS (
   ID INT NOT NULL GENERATED BY DEFAULT AS IDENTITY,
   PRIMARY KEY (ID)
};

然后我试图用我的存储库保存这个实体:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {}

像这样:

userRepository.save(user);

然而这会导致错误

“id”列中的空值违反非空约束

这仅在连接到 PostgreSQL:12.2 时显示,如果我使用 h2 数据库运行相同的代码,它可以正常工作。

为什么这在 PostgreSQL 中失败了?

【问题讨论】:

  • 适用于我的 Hibernate 5.4

标签: java spring postgresql hibernate h2


【解决方案1】:

您应该创建序列并将该序列用作 id

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_seq")
    @SequenceGenerator(name = "user_id_seq", sequenceName = "user_id_seq")
    private long id;

你应该在 postgresql 中创建序列:

CREATE SEQUENCE user_id_seq
INCREMENT 5
START 10;

【讨论】:

  • 一个identity 列已经有一个序列,Hibernate 应该足够聪明以支持GenerationType.IDENTITY 注释 - 这闻起来像一个 Hibernate 错误。使用正确的identity 列是正确的(Postgres)方法。
  • 我认为hibernate在数据库中搜索正确的序列,当它找不到合适的序列时,它可能会失败,但我同意你的观点,hibernate不够聪明
  • Hibernate 根本不应该发送任何值,例如生成 insert into users (name) values ('bla') - 这就是 Hibernate (5.4) 在我的代码中所做的
  • 你使用哪个版本的休眠?
  • 我在 postgres 邮件列表中找到了这个 postgresql.org/message-id/…
【解决方案2】:

制作用户表

创建表用户 ( ID 序列号 NOT NULL 默认为 IDENTITY 生成, 主键 (ID) };

【讨论】:

  • 这与问题中的 CREATE TABLE 语句有何不同?
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 2022-11-25
  • 2020-03-15
  • 2017-07-08
  • 2021-08-06
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多