【问题标题】:How to solve hibernate auto create issue on PostgreSQL with array field?如何使用数组字段解决 PostgreSQL 上的休眠自动创建问题?
【发布时间】:2026-01-31 12:20:03
【问题描述】:

我的一个实体包含一个数组字段,我使用 hibernate-types-52 库进行映射:

@TypeDef(name = "string-array", typeClass = StringArrayType.class)
@Table(name = "some_table")
public class SomeEntity implements Synchronizable {
    @Id
    @SequenceGenerator(name = "some_table_id", sequenceName = "some_table_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "some_table_id_seq")
    @Column(name = "id")
    private Long id;

    @Column(name = "values")
    @Type(type = "string-array")
    private String[] values;
}

application.yml:

spring:
  jpa:
    database: POSTGRESQL
    show-sql: true
    hibernate:
      ddl-auto: create
      show-sql: true
    properties:
      hibernate:
        dialect: my.package.PostgreSQL95ArrayDialect

PostgreSQL95ArrayDialect:

import org.hibernate.dialect.PostgreSQL95Dialect;

import java.sql.Types;

public class PostgreSQL95ArrayDialect
        extends PostgreSQL95Dialect {

    public PostgreSQL95ArrayDialect() {
        super();
        this.registerColumnType(Types.ARRAY, "array");
        this.registerColumnType(Types.OTHER, "jsonb");
    }
}

问题:

o.h.t.s.i.ExceptionHandlerLoggedImpl - GenerationTarget encountered exception accepting command : 
GenerationTarget encountered exception accepting command : 
Error executing DDL "create table some_table (id int8 not null, values array)" via JDBC Statement ... 

所以,SQL 部分的“值数组”看起来很奇怪。我应该如何更改休眠选项或我的代码来修复它?

【问题讨论】:

  • 您需要为正确的 DDL 指定列定义。查看存储库中的 Hibernate-Types 示例
  • @Jan-WillemGmeligMeyling,谢谢,它对我来说很好用!

标签: java postgresql spring-boot hibernate hibernate-types


【解决方案1】:

您必须为正确的表 DDL 指定 columnDefinition,如下所示:

@TypeDef(name = "string-array", typeClass = StringArrayType.class)
@Table(name = "some_table")
public class SomeEntity implements Synchronizable {
    @Id
    @SequenceGenerator(name = "some_table_id", sequenceName = "some_table_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "some_table_id_seq")
    @Column(name = "id")
    private Long id;

    @Column(name = "values")
    @Type(type = "string-array", columnDefinition = "text[]")
    private String[] values;
}

【讨论】:

    最近更新 更多