如何使用数组字段解决PostgreSQL上的休眠自动创建问题?

时间:2020-06-10 13:28:28

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

我的实体之一包括一个数组字段,我使用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部分“值数组”看起来很奇怪。我应该如何更改休眠选项或代码以对其进行修复?

1 个答案:

答案 0 :(得分: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;
}