【问题标题】:Liquibase simple changelog NullPointerExceptionLiquibase 简单变更日志 NullPointerException
【发布时间】:2018-01-27 18:52:57
【问题描述】:

我使用 Liquibase 进行了简单的迁移设置。不幸的是,当我尝试addColumn 时,它会导致 NullPointerException。 (创建表格工作正常)。

// File structure
pom.xml
  src/main/resources/liquibase/
    db.changelog.xml
    liquibase.properties
    changesets/
      simple.changeset.xml


// pom.xml
<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <configuration>
        <propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile>
        <changeLogFile>src/main/resources/liquibase/db.changelog.xml</changeLogFile>
        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
    </configuration>
</plugin>

// simple.changeset.xml
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
     http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd">
    <changeSet id="1517019028" author="me">
        <createTable tableName="test">
            <column name="test_field_1" type="varchar(255)"></column>
        </createTable>
        <addColumn tableName="test">
            <column name="test_field_2" type="varchar(255)"></column>
        </addColumn>
    </changeSet>
</databaseChangeLog>

createTable 命令成功,但addColumn 命令总是失败。运行mvn clean package liquibase:update 会产生以下错误:

java.lang.NullPointerException
    at liquibase.structure.core.Index.setColumns(Index.java:100)
    at liquibase.snapshot.jvm.PrimaryKeySnapshotGenerator.snapshotObject(PrimaryKeySnapshotGenerator.java:65)
    at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:60)
    at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:50)
    at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:194)
    at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:272)
    at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:234)
    at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:208)
    at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:292)
    at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:314)
    at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:234)
    at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:208)
    at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:272)
    at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:234)
    at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:208)
    at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:70)
    at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:44)
    at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.java:21)
    at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:150)
    at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:158)
    at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:154)
    at liquibase.database.core.SQLiteDatabase.getAlterTableStatements(SQLiteDatabase.java:133)
    at liquibase.sqlgenerator.core.AddColumnGeneratorSQLite.generateSql(AddColumnGeneratorSQLite.java:67)
    at liquibase.sqlgenerator.core.AddColumnGeneratorSQLite.generateSql(AddColumnGeneratorSQLite.java:19)
    at liquibase.sqlgenerator.SqlGeneratorChain.generateSql(SqlGeneratorChain.java:30)
    at liquibase.sqlgenerator.SqlGeneratorFactory.generateSql(SqlGeneratorFactory.java:216)
    at liquibase.executor.AbstractExecutor.applyVisitors(AbstractExecutor.java:25)
    at liquibase.executor.jvm.JdbcExecutor.access$500(JdbcExecutor.java:36)
    at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:289)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:107)
    at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1251)
    at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1234)
    at liquibase.changelog.ChangeSet.execute(ChangeSet.java:554)
    at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:51)
    at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73)
    at liquibase.Liquibase.update(Liquibase.java:212)
    at liquibase.Liquibase.update(Liquibase.java:192)
    at liquibase.Liquibase.update(Liquibase.java:327)
    at org.liquibase.maven.plugins.LiquibaseUpdate.doUpdate(LiquibaseUpdate.java:33)
    at org.liquibase.maven.plugins.AbstractLiquibaseUpdateMojo.performLiquibaseTask(AbstractLiquibaseUpdateMojo.java:30)
    at org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute(AbstractLiquibaseMojo.java:394)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

以前有人遇到过这个问题吗?从文档中我可以看出,我的设置相当典型,但我在网上找不到与此问题类似的任何内容。

这是我为显示问题而创建的示例存储库:https://github.com/cha55son/liquibase-add-column-bug

【问题讨论】:

  • 尝试将addColumn移动到不同的changeset
  • 你也可以把&lt;column name="test_field_2" type="varchar(255)"&gt;&lt;/column&gt;放到create table标签正文中
  • 不幸的是,这也无济于事(移动到另一个变更集)。我已经在帖子中添加了一个测试 repo,供任何想要使用它的人使用。
  • 我希望将它们分开,以便在继续开发时创建新的变更集,而不是编辑旧的变更集。

标签: liquibase


【解决方案1】:

这可能是 SQLite 的 liquibase 驱动程序的错误。

https://liquibase.jira.com/browse/CORE-2468

如果是这种情况,您可能需要切换到另一个数据库。

或者,您可以尝试在变更集中使用原始 SQL(基于您的 github 代码):

    <changeSet id="2" author="me">
        <sql>
            ALTER TABLE TEST ADD COLUMN TEST_FIELD varchar(255)
        </sql>
    </changeSet>

【讨论】:

  • 谢谢,确认这确实有效。不理想,但我会给这篇文章更多时间,如果没有更好的答案,我会将这篇文章标记为已接受。
  • 没问题!祝你好运!
猜你喜欢
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2021-01-18
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多