Schema Creation Script With Hibernate 4, JPA And Maven
First, you create a command-line application that handles the export. Note that Ejb3Configuration is deprecated, but it is deprecated for external use – hibernate are using it internally quite a lot. So it is a properly working class:
@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); } }
Note here, that we are not directly deploying the file to the target database. (the 2nd argument to .execute is false). This is because we don’t have our database connection properties in persistence.xml – they are external. Deploying the schema file is done later in the maven build, but this is beyond the scope of this post.
Then we have to just invoke this class from the maven build. I initially tried creating it as an ant task and run it with the antrun plugin, but it has classpath and classloader problems (doesn’t find the entities and persistence.xml). That’s why I used the exec-maven-plugin, which invokes the application in the same JVM as the build is running:
<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>
Then you can use the sql-maven-plugin to deploy the schema.sql file to the target database (you will need to have the externalized db properties loaded by maven, which is done by the properties-maven-plugin).
Reference: How To Generate A Schema Creation Script With Hibernate 4, JPA And Maven from our JCG partner Bozhidar Bozhanov at the Bozho’s tech blog blog.