IntroductionIn this tutorial, we will see how to build a skeleton Java app from scratch based on the Spring framework and capable of having an evolving model persisted on MySql and a related REST web service.
As requirements are changing continuously, we will be handling updates to our model, which in the end translate as updates to our underlying database schema, with Liquibase: a database migration tool
For an overview of how you can manage Database migrations in your development lifecycle, have a look at one of my previous articles: Automatic DB migration for Java web apps with Liquibase
I'll be using maven 3, version 3.0.5 and Java 8 SDK. Google around for installation of these in your environment.
Step 1: Persist a model with JPA and HibernateLet's start with what Spring gives us in Spring Initializr for a maven project with dependencies JPA and MySql.
Here's the generated POM.
In order to have a non-failing maven project, we need to add the details of the database schema to our project.
The resulting properties section in the POM:
And we add these properties to application.properties:
If we launch mvn clean package we have now a successful build.
For details on how to create and assign user permissions on MySql, Google is your friend :-)
Adding our Model and RepositoryLet's add a sample Model class to our app.
And a Repository interface to access the persisted data. Spring Data will automatically generate the implementation for us.
We can now add a test to load all instances from our repository and verify it is working correctly.
In order to populate our Database for tests, we have the option of using Spring annotations directly in our Java unit test source code.
In this case, we will be using the maven-db-unit plugin instead.
Our updated pom.xml:
And our src/test/resources/sample-data.xml for the unit tests.
If we now run our test with mvn clean test, we have a build failure: we have no tables in our MySql schema and dbunit cannot insert the test data.
At this point, we need to generate a DDL script for our schema.
There are a number of options. You could opt for a Spring solution.
We will apply a more generic solution from a third party which works on Spring and non-Spring frameworks: Hibernate Maven Plugin from juplo.de. This is a completely new implementation of the Hibernate Maven plugin updated to Hibernate 5.
We need to add these lines to our pom.xml:
And the file src/test/resources/hibernate.properties needed by the hibernate-maven-plugin:
Notice in the updated pom.xml:
- The hibernate-maven-plugin must appear before the dbunig-maven-plugin: the database tables will be created before the dbunit sample data is inserted.
- Additionally, the file src/test/resources/hibernate.properties needs to be filtered by the standard maven resources plugin.
If we run mvn clean test, our test is finally passing after creating the database tables and populating them with unit test data:
We leave for a future part publishing a REST web service for our model and handling automatic Database migration with Liquibase.
Source code: GitHub