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?