Bozhidar Bozhanov

About Bozhidar Bozhanov

Senior Java developer, one of the top stackoverflow users, fluent with Java and Java technology stacks - Spring, JPA, JavaEE. Founder and creator of Computoser and Welshare. Worked on Ericsson projects, Bulgarian e-government projects and large-scale online recruitment platforms.

Schema Creation Script With Hibernate 4, JPA And Maven

The scenario is trivial – you want to generate a database schema creation script while building your application (and then execute the script on the target database) This was relatively easy with Hibernate 3, as there was the hibernate3-maven-plugin, but it is not compatible with Hibernate 4. And for every new project you should start with Hibernate 4, of course. So what to do? It’s relatively simple, but takes some time to research and test. The idea is to use the SchemaExport tool. But it’s a bit tricky, because it only supports native Hibernate configuration and not JPA.

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.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

JPA Mini Book

Learn how to leverage the power of JPA in order to create robust and flexible Java applications. With this Mini Book, you will get introduced to JPA and smoothly transition to more advanced concepts.

JVM Troubleshooting Guide

The Java virtual machine is really the foundation of any Java EE platform. Learn how to master it with this advanced guide!

Given email address is already subscribed, thank you!
Oops. Something went wrong. Please try again later.
Please provide a valid email address.
Thank you, your sign-up request was successful! Please check your e-mail inbox.
Please complete the CAPTCHA.
Please fill in the required fields.

Leave a Reply


6 × one =



Java Code Geeks and all content copyright © 2010-2014, Exelixis Media Ltd | Terms of Use | Privacy Policy | Contact
All trademarks and registered trademarks appearing on Java Code Geeks are the property of their respective owners.
Java is a trademark or registered trademark of Oracle Corporation in the United States and other countries.
Java Code Geeks is not connected to Oracle Corporation and is not sponsored by Oracle Corporation.
Do you want to know how to develop your skillset and become a ...
Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

Get ready to Rock!
You can download the complementary eBooks using the links below:
Close