1

我正在使用 Spring Boot 和 hibernate 开发一个应用程序,它连接到在 docker 中运行的 postgres 实例。当我第一次创建 myschema.sql时,它看起来像这样:

CREATE TABLE groups(
    group_id varchar(255) PRIMARY KEY,
    group_desc varchar(255),
    group_name varchar(255)
);

表创建成功,但是我很快意识到 255 对我的目的来说太短了,并将我的架构更改为以下内容:

CREATE TABLE groups(
    group_id text PRIMARY KEY,
    group_desc text,
    group_name text
);

但是,数据库会不断恢复到原始数据类型。我试过删除表,但是当 Spring 应用程序运行并再次创建它varchar(255)而不是text. 如何强制休眠使用更新的架构?

我尝试将spring.jpa.hibernate.ddl-auto属性更改为createand update,并尝试将字段更改为其他数据类型,包括其他长度的varchar. 到目前为止没有任何效果。即使删除schema.sql看似没有效果。

我的application.properties样子是这样的:

spring.jpa.database=POSTGRESQL
spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=<redacted>
spring.datasource.password=<redacted>
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
4

1 回答 1

2

Text数据类型不是 aVarchar而是CLOBa 。

检查你的Groups班级。我猜nameanddesc属性是String,默认相关的 db 类型是 then VARCHAR(255)。因此,如果你从你的实体生成你的模式,String总是变成VARCHAR(255)

如果你想使用Text,你的字段应该用@Lob

public class Groups {
    @Lob
    @Column(name = "group_desc")
    private String desc

    @Lob
    @Column(name = "group_name")
    private String name
}

话虽如此,我认为您应该更改您的 java/db 模型,因为将Lob/Text类型作为主/外键让我有点害怕(即使我从未尝试过)

CREATE TABLE groups(
    group_id bigint PRIMARY KEY,
    group_code text NOT NULL UNIQUE,
    group_desc text,
    group_name text
);
public class Groups {
    @Id
    @Column(name = "group_id")
    private Long id;

    @Lob
    @Column(name = "group_code", nullable = false, unique = true)
    private String code;

    @Lob
    @Column(name = "group_desc")
    private String desc;

    @Lob
    @Column(name = "group_name")
    private String name;
}

注意:我通常不会从实体生成架构,所以我使用下面的代码将 db 文本字段映射到实体属性:

    @Column(name = "group_desc", columnDefinition = "CLOB")
    private String desc;

但我不确定这是否被正确处理以生成模式

于 2020-05-19T19:11:16.807 回答