It’s actually pretty simple to create some kind of diff yourself.
The following code uses only JPA stuff but some hibernate specific properties.
String unitName = … //JPA unit name String changeLogPath = … //Path to the changelog master String driverClass = “org.h2.Driver”; String oldJdbcUrl = “jdbc:h2:mem:old”; String newJdbcUrl = “jdbc:h2:mem:new”; String user = “test”; String password = “test”; Database newDatabase = new H2Database(); newDatabase.setConnection(new JdbcConnection(DriverManager.getConnection(newJdbcUrl, user, password))); Database oldDatabase = new H2Database(); oldDatabase.setConnection(new JdbcConnection(DriverManager.getConnection(oldJdbcUrl, user, password))); Liquibase oldLiquibase = new Liquibase(changeLogPath, new ClassLoaderResourceAccessor(), oldDatabase); oldLiquibase.update(""); Liquibase newLiquibase = new Liquibase(null, null, newDatabase); newLiquibase.dropAll(); // Schema export to new database Map<String, Object> properties = new HashMap<String, Object>(); // Hibernate specific properties.put(“hibernate.hbm2ddl.auto”, “create”); properties.put(“hibernate.cache.region.factory_class”, null); properties.put(“hibernate.cache.use_query_cache”, false); properties.put(“hibernate.cache.use_second_level_cache”, false); properties.put(“hibernate.dialect”, “org.hibernate.dialect.H2Dialect”); properties.put(“javax.persistence.jtaDataSource”, null); properties.put(“javax.persistence.transactionType”, “RESOURCE_LOCAL”); properties.put(“javax.persistence.jdbc.driver”, driverClass); properties.put(“javax.persistence.jdbc.user”, user); properties.put(“javax.persistence.jdbc.password”, password); properties.put(“javax.persistence.jdbc.url”, newJdbcUrl); EntityManagerFactory emf = Persistence.createEntityManagerFactory(unitName, properties); // Diff DatabaseSnapshot oldSnapshot = SnapshotGeneratorFactory.getInstance().createSnapshot(oldDatabase.getDefaultSchema(), oldDatabase, new SnapshotControl(oldDatabase)); DatabaseSnapshot newSnapshot = SnapshotGeneratorFactory.getInstance().createSnapshot(newDatabase.getDefaultSchema(), newDatabase, new SnapshotControl(newDatabase)); CompareControl compareControl = new CompareControl( new CompareControl.SchemaComparison[] { new CompareControl.SchemaComparison(new CatalogAndSchema( newDatabase.getDefaultCatalogName(), newDatabase.getDefaultSchemaName()), new CatalogAndSchema( oldDatabase.getDefaultCatalogName(), oldDatabase.getDefaultSchemaName())) }, oldSnapshot.getSnapshotControl().getTypesToInclude()); DiffResult diffResult = oldLiquibase.diff(newDatabase, oldDatabase, compareControl); new DiffToChangeLog(diffResult, new DiffOutputControl(false, false, true)){ @Override public List generateChangeSets() { List changeSets = super.generateChangeSets(); List newChangeSets = new ArrayList; ChangeSet changeSet = new ChangeSet(generateId(), getChangeSetAuthor(), false, false, null, null, null, ObjectQuotingStrategy.QUOTE_ALL_OBJECTS, null);
newChangeSets.add(changeSet);
for(ChangeSet set : changeSets) { for(Change change : set.getChanges()) {
boolean include = true;
if(change instanceof CreateIndexChange) { CreateIndexChange index = (CreateIndexChange) change; for(Change existingChange : changeSet.getChanges()) { if(existingChange instanceof AddUniqueConstraintChange) { AddUniqueConstraintChange unique = (AddUniqueConstraintChange) existingChange; boolean catalogEqual = unique.getCatalogName() == null ? index.getCatalogName() == null : unique.getCatalogName().equals(index.getCatalogName()); boolean schemaEqual = unique.getSchemaName() == null ? index.getSchemaName() == null : unique.getSchemaName().equals(index.getSchemaName()); if(catalogEqual && schemaEqual && unique.getTableName().equals(index.getTableName())) { StringBuilder sb = new StringBuilder(); for(ColumnConfig column : index.getColumns()) { sb.append(column.getName()).append(’,’); } sb.setLength(sb.length() - 1); if(unique.getColumnNames().equals(sb.toString())) { // TODO: instead of remove, add a precondition ifIndexDoesNotExist include = false; } break; } } } }
if(include) {
//create only a single changeset
changeSet.addChange(change);
//alternative, many changesets
//ChangeSet newChangeSet = new ChangeSet(generateId(), getChangeSetAuthor(), false, false, null, null, null, ObjectQuotingStrategy.QUOTE_ALL_OBJECTS, null);
//newChangeSet.addChange(change);
//newChangeSets.add(newChangeSet);
}
} } return Arrays.asList(changeSet); } }.print(System.out); emf.close(); oldDatabase.close(); newDatabase.close();