如果 id 是 bigserial,则 Postgres 分区无法与休眠一起使用

Postgres Partitioning not working with hibernate if id is bigserial

我已经在 Postgres 中对 table 进行了分区。所以现在有 2 tables :

  1. Base table 用户,没有主键但对 id 列使用序列生成器:nextval('users_id_seq'::regclass)
  2. Child table 继承用户

    CREATE TABLE users_part_2019_01 (
        CHECK (createdon >= '2019-01-01 00:00:00'
                        AND createdon < '2019-02-01 00:00:00')
    ) INHERITS (users);
    
    ALTER TABLE users_part_2019_01 ADD CONSTRAINT users1_pkey PRIMARY KEY (id);
    

我正在使用 jpa 向用户 table 插入数据。在我使用的数据模型中:

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

出现以下错误:

"org.springframework.orm.jpa.JpaSystemException: The database returned no natively generated identity value; nested exception is org.hibernate.HibernateException: The database returned no natively generated identity value at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:333) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)"

它与 postgres 独立地按预期工作。

得到解决方案。 GenerationType.IDENTITY 而不是 GenerationType.AUTO 正在工作

如果您是从 spring 引导 (2.2.x +) 来到这里并使用 postgresql 分区,仅接受的答案不足以使其工作。在这种情况下,Hibernate 将抛出以下内容:

Schema-validation: missing sequence [schema_name.hibernate_sequence]

在这种情况下,hibernate 只是希望您通过将其传递为序列字段来提供标识生成器:

@GeneratedValue(strategy = GenerationType.AUTO, generator = "schema_name.generator_sequence_name_seq")