Hibernate 5.3.6 + Spring - генерировать сценарий DDL в потоке без предварительной записи в файл - PullRequest
0 голосов
/ 05 декабря 2018

Мне нужно сделать в моем приложении visibile скрипт обновления для схемы базы данных, который Hibernate генерирует со свойством

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.

...