现有数据库上的 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 迁移导致“列中遇到错误的列类型”的主要内容,如果未能解决你的问题,请参考以下文章
Java基础学习总结(183)—— Flyway 在项目中迁移数据实践