1

I am trying to generate liquibase changeset programtically using liquibase and liquibase-hiberante using the code below

    Class.forName("org.mariadb.jdbc.Driver");
    Connection connection = DriverManager.getConnection("jdbc:mariadb://localhost:3306/sample_database", "root", "");

    connection.getMetaData().getDriverName();
    Database database = new MariaDBDatabase();
    database.setConnection(new JdbcConnection(connection));
    final Liquibase liquibase = new Liquibase("", new ClassLoaderResourceAccessor(), database);

    Database hibernateDatabase = new HibernateSpringPackageDatabase();
    hibernateDatabase.setDefaultSchemaName("sample_database");
    hibernateDatabase.setDefaultCatalogName("sample_database");
    hibernateDatabase.setConnection(new JdbcConnection(new HibernateConnection("hibernate:spring:" + "com.example.hibernateddl" + "?dialect=" + MariaDBDialect.class.getName(), new ClassLoaderResourceAccessor())));
    ObjectChangeFilter objectChangeFilter = null;
    String diffChangeLogFile = "/tmp/abc.xml";
    File outFile = new File(diffChangeLogFile);
    //    liquibase.update(changesToApply, new Contexts(contexts), new LabelExpression(labels));

    final Liquibase liquibaseUpdate = new Liquibase(outFile.toString(), new FileSystemResourceAccessor(File.listRoots()), database);



    try {
        DiffOutputControl diffOutputControl = new DiffOutputControl(false, false, true, null);
        diffOutputControl.setObjectChangeFilter(objectChangeFilter);
        CommandLineUtils.doDiffToChangeLog(outFile.toString(), hibernateDatabase, database, diffOutputControl,
                objectChangeFilter, StringUtil.trimToNull(null),null);


        liquibaseUpdate.update("");

    } catch (IOException | ParserConfigurationException e) {
        throw new LiquibaseException(e);
    }

My Entity looks like this

@Entity
public class Sample {
    @Id
    long id;
    @Column(name = "username",columnDefinition = "varchar(15) default 'dfds'")

    String username;
    @Column(name = "password",columnDefinition = "varchar(15) default null")
    String password;


    String oneMoreField2;

    String oneMoreField3;
}

when program is run first time the changeset is generated correctly and looks like this

 <createTable tableName="Sample">
            <column name="id" type="BIGINT">
                <constraints nullable="false" primaryKey="true" primaryKeyName="SamplePK"/>
            </column>
            <column name="oneMoreField2" type="VARCHAR(255)"/>
            <column name="oneMoreField3" type="VARCHAR(255)"/>
            <column name="password" type="VARCHAR(15)"/>
            <column defaultValue="dfds" name="username" type="VARCHAR(15)"/>
        </createTable>
    </changeSet>

when i run the same program second time i expect no changeset to be generated but my changelog file is modified to this

<changeSet author="ArshidDar (generated)" id="1627654919339-1">
        <createTable tableName="Sample">
            <column name="id" type="BIGINT">
                <constraints nullable="false" primaryKey="true" primaryKeyName="SamplePK"/>
            </column>
            <column name="oneMoreField2" type="VARCHAR(255)"/>
            <column name="oneMoreField3" type="VARCHAR(255)"/>
            <column name="password" type="VARCHAR(15)"/>
            <column defaultValue="dfds" name="username" type="VARCHAR(15)"/>
        </createTable>
    </changeSet>
    <changeSet author="ArshidDar (generated)" id="1627655078245-1">
        <dropDefaultValue columnDataType="varchar(255)" columnName="oneMoreField2" tableName="Sample"/>
    </changeSet>
    <changeSet author="ArshidDar (generated)" id="1627655078245-2">
        <dropDefaultValue columnDataType="varchar(255)" columnName="oneMoreField3" tableName="Sample"/>
    </changeSet>
    <changeSet author="ArshidDar (generated)" id="1627655078245-3">
        <addDefaultValue columnDataType="varchar(15)" columnName="password" defaultValue="null" tableName="Sample"/>
    </changeSet>

can someone help?

arshid dar
  • 1,355
  • 2
  • 15
  • 23
  • It sounds like an issue with Liquibase not correctly reading database vs. hibernate metadata and/or not smoothing over particular differences. If you run a `liquibase diff` between them, what does it list as the differences? That will help us know what information Liquibase is working from as it figures out what changes need to be made. – Nathan Voxland Sep 21 '21 at 17:37
  • had the same issue with liquibase-hibernate6:4.19.0. Seems to be fixed in 4.22.0 – charvi May 28 '23 at 15:42

0 Answers0