【问题标题】:Hibernate ignoring changes in schema.sqlHibernate 忽略 schema.sql 中的更改
【发布时间】:2020-05-19 18:24:51
【问题描述】:

我正在使用 Spring Boot 和 hibernate 开发一个应用程序,它连接到在 docker 中运行的 postgres 实例。当我第一次创建 schema.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 属性更改为createupdate,并尝试将字段更改为其他数据类型,包括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

【问题讨论】:

    标签: java spring postgresql hibernate spring-boot


    【解决方案1】:

    Text 数据类型不是Varchar,而是CLOB

    检查您的Groups 课程。我猜namedesc 属性是String,默认的相关数据库类型是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;
    

    但我不确定这是否被正确处理以生成架构

    【讨论】:

    • 使用@Lob 有效!所以 schema.sql 实际上什么也没做?
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2023-03-21
    • 2017-02-08
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多