Hibernate 5.3.6 + Spring-在流上生成DDL脚本,而无需先写文件

时间:2018-12-05 16:45:04

标签: java spring hibernate ddl

我需要在应用程序中使Hibernate使用属性生成的数据库模式的更新脚本<​​/ p>

spring.jpa.hibernate.ddl-auto=update

我编写了这个SchemaUpdateGenerator类,但效果很好。

public class SchemaUpdateGenerator {

private Environment environment;
private SchemaUpdate schemaUpdate;

public SchemaUpdateGenerator(Environment environment) {
    this.environment = environment;
}

public String generateCreateAnUpdateDDL(){


    StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder();

    Map<String, String> settings = new HashMap<>();
    settings.put("hibernate.connection.driver_class",environment.getProperty("spring.datasource.driver-class"));
    settings.put("hibernate.connection.url",environment.getProperty("spring.datasource.url"));
    settings.put("hibernate.connection.username",environment.getProperty("spring.datasource.username"));
    settings.put("hibernate.connection.password",environment.getProperty("spring.datasource.password"));
    settings.put("hibernate.dialect","org.hibernate.dialect.Oracle10gDialect");

    registryBuilder.applySettings(settings);
    StandardServiceRegistry registry = registryBuilder.build();

    MetadataSources sources = new MetadataSources(registry);

    List<String> classes = addAnnotatedClasses(); //returns list of annotated classes

    classes.forEach(s -> {
        try {
            sources.addAnnotatedClass(Class.forName(s));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    });


    Metadata metadata = sources.getMetadataBuilder().build();

    SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();


    schemaUpdate = new SchemaUpdate((MetadataImplementor) sources.buildMetadata());
    schemaUpdate.setOutputFile(environment.getProperty("scriptpath"));
    execute(true, false);

    SchemaExport schemaExport = new SchemaExport((MetadataImplementor) sources.buildMetadata());


    List<String> stream = new ArrayList<>();
    try {
        stream = Files.lines(Paths.get(environment.getProperty("scriptpath"))).collect(Collectors.toList());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return String.join("\r\n",stream);
}

public void execute(boolean script,boolean doUpdate){
    schemaUpdate.execute(script, doUpdate);
}

我想生成此脚本而不将其写在文件上,只是获得一个我可以在运行时读取的流,而我真的找不到用Hibernate 5.3.6实现此脚本的方法。我为Hibernate 4.x看到了SchemaExporte类提供了generateSchemaUpdateScript方法,该方法似乎已在5.x版本中删除。

0 个答案:

没有答案