Мне нужно сделать в моем приложении 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.