【问题标题】:How to add new column in existing pojo : Spring boot如何在现有 pojo 中添加新列:Spring boot
【发布时间】:2022-01-18 05:39:49
【问题描述】:

我正在开发 Spring Boot 并使用 Postgres DB。 我有一个要求,比如我需要在现有表中添加一个新列。

    @Entity
    @TypeDefs({@TypeDef(name = "EnumUserType", typeClass = EnumUserType.class)})
    public class P_user {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = 
    "p_user_row_id_generator")
    @SequenceGenerator(name = "p_user_row_id_generator",
            sequenceName = "p_user_row_id_sequence",
            allocationSize = 50)
    @Column(name = "row_id")
    private Long rowId;

    private UUID p_Id;

    private String username;

    @Type(type = "EnumUserType", parameters = {
            @Parameter(name = "enumClassName", value = "P_userRole")})
    private P_userRole role;

    private Date startTime;

    private Date endTime;

    //new Id tobe added
    private UUID groupId;
    }

我正在使用脚本来动态更改数据库中的表。

在 xyz.sql 文件中

  ALTER TABLE p_user ADD COLUMN groupId UUID;
 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating 
   bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateSqlException: 
    
    Migration xyz.sql failed
    -----------------------------------------------
    SQL State  : 42701
    Error Code : 0
    Message    : ERROR: column "groupid" of relation "p_user" already exists
    Location   : ../db/migration/xyz.sql 
    Line       : 4
    Statement  : ALTER TABLE p_user ADD COLUMN groupId UUID

如果我不运行这个脚本,那么我会得到

ERROR: column "group_id" of relation "p_user" does not exist.

我怎样才能获得新列来现有实体,我也需要在 db 中更改表。

请在这里帮助我。欢迎提出任何建议! 蒂亚!

【问题讨论】:

  • 猜测默认行为会将groupId 转换为snake_case,从而导致查询为select ..., group_id ...。尝试指定列名,例如,@Column(name = "groupId")
  • 在开发过程中,您可以在配置文件中将 DDL.update 标志设置为 true。

标签: java spring-boot spring-data-jpa flyway


【解决方案1】:

我不确定您是否可以直接在代码中编写脚本。 Flyway 迁移在 https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/html/howto-database-initialization.html#howto-use-a-higher-level-database-migration-tool 的 Spring Boot 文档中进行了介绍。

一般的想法是启用flyway,将迁移脚本放在一个公共位置,然后spring初始化和flyway从那里接管。在我们的例子中,“启用 flyway”只是将依赖项添加到 pom.xml(我 认为 实现了文档所描述的“将 org.flywaydb:flyway-core 添加到您的类路径”)我们在 application.properties 中放置了一个属性spring.flyway.enabled=true

你的文件名看起来很可疑; xyz.sql。 Flyway 迁移通常采用V<VERSION>__<NAME>.sql 的形式。请注意,将“版本字符串”与“名称字符串”分开的行中有 2 个“_”。

Flyway 希望该名称为“版本”,如果您在 db.migrations 目录中使用静态 sql,名称看起来像...

Vabc__some_friendly_text.sql

Flyway 正在使用初始“​​V”右侧的内容来“版本”迁移。所以“xyz”不是一个很好的起点,因为没有太多空间进行新的迁移(xyz、xzz、yyz、yzz、zyz、zzz、呃哦……)。通常你会看到人们在那里使用 ISO-8601 字符串之类的东西。

V20210101__create.sql
V20210102__add_foo_table.sql
V20210201__index_something_add_some_data.sql

我不知道这是否是您远程询问的...但这就是我们如何利用 Spring Boot 中的 Flyway 将我们的数据库模式置于版本控制之下。 Spring Docs 是一个很好的起点。 baeldung人也总结的不错:https://www.baeldung.com/database-migrations-with-flyway

【讨论】:

  • 虽然,您可以用 Java 编写迁移,但 Vxxxxx__something.sql 仍然适用于 Vxxxxxx 级别。
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 2016-08-02
  • 2019-01-02
  • 2018-09-01
  • 2021-10-24
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多