现有数据库上的 flyway 迁移导致“列中遇到错误的列类型”

Posted

技术标签:

【中文标题】现有数据库上的 flyway 迁移导致“列中遇到错误的列类型”【英文标题】:flyway migration on existing database results in "wrong column type encountered in column" 【发布时间】:2019-06-02 02:28:37 【问题描述】:

我有使用我的数据库模式的 Spring Boot 应用程序。假设我有非空模式,表 APPLICATION_USERS 定义如下:

create table AREA
(
  name NVARCHAR2(36) not null,
  id   NUMBER not null
)

现在我想将 FlyWay 添加到我的应用程序中。我在我的应用程序属性中定义了flyway.baselineOnMigrate=true 以启动初始 Flyway 部署,并在spring.jpa.hibernate.ddl-auto=validate 中定义了我的 Enities Again 架构,但是在启动应用程序时出现以下错误:

 wrong column type encountered in column [name] in table [APPLICATION_USERS]; found [nvarchar2 (Types#OTHER)], but expecting [varchar2(255 char) (Types#VARCHAR)]

据我了解,它抱怨NVARCHAR2,正如它所期望的varchar 我如何强制休眠接受nvarchar2 作为varchar

我知道我可以在我的实体属性上使用columnDefinition,但这不是我梦寐以求的解决方案,还有其他方法吗?

【问题讨论】:

【参考方案1】:

我假设您使用的是 Oracle 数据库。

您必须在实体中使用 Nationalized 注释您的属性名称

@Nationalized
private String name;

您也可以注册自己的方言:

public class CustomOracleDialect extends Oracle10gDialect 

    public CustomOracleDialect() 
        super();
        registerColumnType(Types.NVARCHAR, "nvarchar2($l)");
        registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
    

【讨论】:

你当然是对的,但是我在整个应用程序中都有数百个这样的案例,所以添加这个注释真的很痛苦,还有其他方法吗? 是的,您可以注册自己的方言。我会将其添加到我的答案中

以上是关于现有数据库上的 flyway 迁移导致“列中遇到错误的列类型”的主要内容,如果未能解决你的问题,请参考以下文章

实战Flyway迁移指南最佳实践

Java基础学习总结(183)—— Flyway 在项目中迁移数据实践

Java基础学习总结(183)—— Flyway 在项目中迁移数据实践

生产数据库中的 Flyway 集成

如何处理无效的先前有效的 Flyway 迁移

检测到的已解决迁移未应用于 flyway 上的数据库