【问题标题】:HIbernate do not use sequence for PostgreSQLHIbernate 不使用 PostgreSQL 序列
【发布时间】:2018-09-14 09:21:12
【问题描述】:

我遇到了一些问题:我需要在 PostgreSQL 中使用序列来生成 id。但是当我在表中保存新对象时,它说 id 为 null

org.postgresql.util.PSQLException: ERROR: null value in column "id" violates not-null constraint

我使用这些注释:

    @SequenceGenerator(name = "fooGen", sequenceName = "FOO_SEQ",   allocationSize = 1)
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "fooGen")
    @Column(columnDefinition = "numeric")
    private BigInteger id;

这适用于甲骨文。我看过很多问题,但大多数使用的是 GenerationType.AUTO 或 GenerationType.IDENTITY,解决方案是使用 GenerationType.SEQUENCE。不过我已经在用了。

尝试使用存储库方法保存我的实体时遇到此异常

fooRepository.saveAndFlush(entity);

我的数据库是 PostgreSQL 9.6.1。 我用

org.hibernate.dialect.PostgreSQL9Dialect

序列存在,我检查过了。如果它不存在,hibernate.hbm2ddl.auto=validate 会给我异常。

请帮帮我,我哪里做错了?

我正在使用数据库架构:

<prop key="hibernate.default_schema">${jdbc.postgresql.schema}</prop>

也许,这会导致一些问题?

提前致谢

【问题讨论】:

  • 这听起来可能很愚蠢,但是你的数据库中有这个序列 FOO_SEQ 吗?
  • 是的,我的应用程序使用的数据库模式中有序列
  • 如果您仍处于可以在数据库中进行调整的阶段,我建议您使用 serial 字段并让 postgres 处理其余部分。

标签: java postgresql hibernate sequence


【解决方案1】:

尝试将 id 的类型更改为Long like

   @SequenceGenerator(name = "fooGen", sequenceName = "FOO_SEQ",   allocationSize = 1)
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "fooGen")
    @Column(columnDefinition = "numeric")
    private Long id;

【讨论】:

  • 可以肯定 - 所有注释都是从包'javax.persistence'导入的,对吗?
  • 是的,但是我写了一些简单的代码来创建我的实体。它毫无例外地工作。所以,其他地方肯定有错误,谢谢帮助)
【解决方案2】:

这个表是多对多关系,连接两个实体的表有自己的id字段。 Hibernate 没有为这个表映射的 Java 类,也没有设置这个 id。解决方案是删除该字段。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多