В течение долгого времени у меня есть небольшое приложение в Java, которое использует hibernate SchemaExport, чтобы получить всю фактическую структуру базы данных в файле. Это работало нормально с Hibernate 4.X.
В основном я выполняю в Java Main.class:
hibernateConfiguration.setProperty("hibernate.hbm2ddl.auto", "create");
hibernateConfiguration.setProperty("hibernate.dialect", dialect.getDialectClass());
hibernateConfiguration.setProperty("hibernate.connection.url", "jdbc:mysql://" + host + ":" + port + "/"
SchemaExport export = new SchemaExport(hibernateConfiguration);
export.setDelimiter(";");
export.setOutputFile(outputFile);
export.setFormat(true);
export.execute(false, false, false, true);
И я запускаю его каждый раз, когда проект выполняется с использованием exec-maven-plugin
:
<!-- Creates the database script BEFORE testing -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.schemaexporter.main</mainClass>
<!-- <skip>true</skip> -->
<arguments>
[...] <!-- Some database connection parameters -->
</arguments>
</configuration>
</plugin>
Теперь я только что обновился до Hibernate 5 (5.2.17.Final). И для этой цели я обновил свой код до:
MetadataSources metadata = new MetadataSources(new StandardServiceRegistryBuilder().applySetting("hibernate.hbm2ddl.auto", "create")
.applySetting("hibernate.connection.driver_class", dialect.getDriver())
.applySetting("hibernate.dialect", dialect.getDialectClass())
.applySetting("hibernate.connection.driver_class", dialect.getDriver())
.applySetting("hibernate.connection.url", "jdbc:mysql://" + host + ":" + port + "/" + databaseName)
.applySetting("hibernate.connection.username", username)
.applySetting("hibernate.connection.password", password).build());
SchemaExport export = new SchemaExport();
export.setDelimiter(";");
export.setOutputFile(directory + File.separator + outputFile);
export.setFormat(true);
export.execute(EnumSet.of(TargetType.SCRIPT), SchemaExport.Action.CREATE, metadata.buildMetadata());
Сценарий базы данных создан правильно. Но exec-maven-process
зависает и не продолжает другие действия. Что касается зависания, я имею в виду, что процесс maven никогда не заканчивается и не продолжается на следующих этапах (выполнение унитарных тестов).
То, что я пробовал до сих пор:
- Добавление к
exec-maven-plugin
опции <async>true</async>
, но ничего не меняется.
- Добавление
System.exit(0)
в основной класс, но maven убит и не переходит к следующим фазам.
- Создание работающего скрипта в bash, как предложено , здесь , и процесс возвращает
Async process complete, exit value = 0
, но скрипт базы данных не генерируется. Может быть, я могу углубиться в сценарий, чтобы найти ошибку, но это не мой предпочтительный путь.
Тем не менее, я не понимаю, почему изменение Hibernate 4 на Hibernate 5 приводит к тому, что процесс не завершается. Я проверил код (базовый System.out
везде), и все строки выполняются правильно до конца, но процесс все еще жив.
Кто-нибудь знает, есть ли изменение поведения в Hibernate 5, которое вызывает это нежелательное поведение?