有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate 5。x迁移建议脚本

我正在尝试转换我的工作(使用Hibernate 4.x)脚本,该脚本建议从实际数据库进行迁移。这非常方便,尤其是当我想要跟踪更改并将其存储在FlyWay使用的sql脚本中时

这是我的班级:

public class SchemaGenerator {

private static Configuration cfg;
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost/test?tinyInt1isBit=false";
private static String username = "root";
private static String password = "password";

public SchemaGenerator(String packageName) throws Exception {
    cfg = new Configuration();
    cfg.setProperty("hibernate.hbm2ddl.auto", "update");
    cfg.setProperty("hibernate.connection.driver_class", driver);
    cfg.setProperty("hibernate.connection.url", url);
    cfg.setProperty("hibernate.connection.username", username);
    cfg.setProperty("hibernate.connection.password", password);
    cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

    Reflections reflections = new Reflections("com.test");
    Set<Class<? extends Object>> allClasses = reflections.getTypesAnnotatedWith(Entity.class);
    for (Class c : allClasses) {
        cfg.addAnnotatedClass(c);
    }

}

public static void validate() {
    SchemaValidator schemaValidator = new SchemaValidator(cfg);
    schemaValidator.validate();
}

public List<SchemaUpdateScript> createUpdateScript(DataSource dataSource, org.hibernate.dialect.Dialect dialect)
        throws SQLException {
    DatabaseMetadata meta = new DatabaseMetadata(dataSource.getConnection(), dialect, cfg);
    List<SchemaUpdateScript> createSQL = cfg.generateSchemaUpdateScriptList(dialect, meta);

    return createSQL;
}

/**
 * @param args
 */
public static void main(String[] args) throws Exception {
    SchemaGenerator gen = new SchemaGenerator("com.test");
    Driver driver = com.mysql.jdbc.Driver.class.newInstance();
    DataSource dataSource = new SimpleDriverDataSource(driver, url, username, password);

    List<SchemaUpdateScript> updateCommands = gen.createUpdateScript(dataSource,
            new org.hibernate.dialect.MySQL5Dialect());
    if (updateCommands.size() != 0)
        System.out.println("" + formatSqlSuggestionScript(updateCommands));
    else
        System.out.println("Already up to date");
}

private static String formatSqlSuggestionScript(List<SchemaUpdateScript> sqls) {
    StringBuilder builder = new StringBuilder("\n\n****update sql suggestion:***\n\n");
    for (SchemaUpdateScript str : sqls) {
        builder.append("\n" + str.getScript() + ";");
    }
    builder.append("\n\n");
    return builder.toString();
}

}

我对schemaValidator.validate();有一些问题,因为现在它需要元数据,而cfg.generateSchemaUpdateScriptList(dialect, meta)已经不存在了

你有什么好的开始提示吗?或者现在有没有更好的方法来使用Hibernate 5x来实现这一点


共 (1) 个答案

  1. # 1 楼答案

    可以实例化org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl并使用SchemaValidator