Статьи

Скрипт создания схемы с Hibernate 4, JPA и Maven

Сценарий тривиален — вы хотите сгенерировать сценарий создания схемы базы данных при создании приложения (а затем выполнить сценарий для целевой базы данных). Это было относительно легко с Hibernate 3, так как был плагин hibernate3-maven-plugin , но это несовместим с Hibernate 4. И для каждого нового проекта вы должны начинать с Hibernate 4, конечно. Так что делать? Это относительно просто, но требует времени для исследования и тестирования. Идея состоит в том, чтобы использовать инструмент SchemaExport. Но это немного сложно, потому что он поддерживает только собственную конфигурацию Hibernate, а не JPA.

Сначала вы создаете приложение командной строки, которое обрабатывает экспорт. Обратите внимание, что Ejb3Configuration устарела, но не рекомендуется для внешнего использования — hibernate использует его внутри довольно часто. Так что это правильно работающий класс:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@SuppressWarnings('deprecation')
public class JpaSchemaExport {
 
 public static void main(String[] args) throws IOException {
  execute(args[0], args[1], Boolean.parseBoolean(args[2]), Boolean.parseBoolean(args[3]));
 }
 
 public static void execute(String persistenceUnitName, String destination, boolean create, boolean format) {
  System.out.println('Starting schema export');
  Ejb3Configuration cfg = new Ejb3Configuration().configure(persistenceUnitName, new Properties());
  Configuration hbmcfg = cfg.getHibernateConfiguration();
  SchemaExport schemaExport = new SchemaExport(hbmcfg);
  schemaExport.setOutputFile(destination);
  schemaExport.setFormat(format);
  schemaExport.execute(true, false, false, create);
  System.out.println('Schema exported to ' + destination);
 }
}

Обратите внимание, что мы не развертываем файл напрямую в целевой базе данных. (2-й аргумент для .execute — false). Это потому, что у нас нет свойств подключения к базе данных в persistence.xml — они внешние. Развертывание файла схемы выполняется позже в сборке maven, но это выходит за рамки этого поста.

Затем мы должны просто вызвать этот класс из сборки maven. Сначала я попытался создать его как задачу ant и запустить с помощью плагина antrun, но у него есть проблемы с classpath и загрузчиком классов (не находит сущности и persistence.xml). Вот почему я использовал exec-maven-plugin, который вызывает приложение в той же JVM, что и сборка:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
<plugin>
 <groupId>org.codehaus.mojo</groupId>
 <artifactId>exec-maven-plugin</artifactId>
 <version>1.1</version>
 <executions>
  <execution>
   <phase>${sql.generation.phase}</phase> <!-- this is process-classes in our case currently -->
   <goals>
    <goal>java</goal>
   </goals>
  </execution>
 </executions>
 <configuration>
  <mainClass>com.yourcompany.util.JpaSchemaExport</mainClass>
  <arguments>
   <argument>core</argument>
   <argument>${project.build.directory}/classes/schema.sql</argument>
   <argument>true</argument>
   <argument>true</argument>
  </arguments>
 </configuration>
</plugin>

Затем вы можете использовать sql-maven-plugin для развертывания файла schema.sql в целевой базе данных (вам понадобится загрузить внешние свойства db, загруженные maven, что делается с помощью свойства-maven-plugin).

Ссылка: Как сгенерировать сценарий создания схемы с Hibernate 4, JPA и Maven от нашего партнера JCG Божидара Божанова в техническом блоге Bozho.