Skip to content
Snippets Groups Projects
user avatar
Guillaume Maka authored
c7c61aee
History

Liquibase + Spring Boot + JPA + H2

This project demonstrate how to integrate Liquibase migration tools with Spring Boot Data Jpa with H2 Database

This project is configured to:

  • Auto update changelog to watching JPA Models in com.liquibaseexample.liquibasedemo.models package
  • Use H2 Database platform
  • Use Spring Boot Data JPA

Test

  1. Create a new model in com.liquibaseexample.liquibasedemo.models package

package com.liquibaseexample.liquibasedemo.models;

import javax.persistence.*;

@Entity(name = "profiles")
public class Profile {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column
    private String firstname;
    @Column
    private String lastname;

    public Profile() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
}

  1. Run mvn spring-boot:run

Result

You should see in the console the generation/migration process of the new added model.

[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------< com.liquibaseexample:liquibase-demo >-----------------
[INFO] Building liquibase-demo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] >>> spring-boot-maven-plugin:2.2.6.RELEASE:run (default-cli) > test-compile @ liquibase-demo >>>
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ liquibase-demo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 3 resources
[INFO] 
[INFO] --- liquibase-maven-plugin:3.8.8:update (generate-db-prev) @ liquibase-demo ---
[INFO] ------------------------------------------------------------------------
[INFO] Parsing Liquibase Properties File
[INFO]   File: src/main/resources/liquibase.properties
[INFO]   'referenceUrl' in properties file is not being used by this task.
[INFO]   'outputChangeLogFile' in properties file is not being used by this task.
[INFO]   'diffChangeLogFile' in properties file is not being used by this task.
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] 
[INFO] Liquibase Community 3.8.8 by Datical
[INFO] Starting Liquibase at jeu., 09 avr. 2020 05:53:23 EDT (version 3.8.8 #66 built at Thu Mar 19 08:17:43 UTC 2020)
[INFO] Parsing Liquibase Properties File src/main/resources/liquibase.properties for changeLog parameters
[INFO] Executing on Database: jdbc:h2:file:classpath://mydb
[WARNING] Namespace of the [javax.xml.bind.annotation.XmlSchema] annotation does not match [http://www.hibernate.org/xsd/orm/hbm]. Processing bindings will probably fail.
[INFO] SELECT COUNT(*) FROM DATABASECHANGELOGLOCK
[INFO] SELECT COUNT(*) FROM DATABASECHANGELOGLOCK
[INFO] SELECT LOCKED FROM DATABASECHANGELOGLOCK WHERE ID=1
[INFO] Successfully acquired change log lock
[INFO] Dropping Database Objects in schema: MYDB.PUBLIC
[INFO] SELECT MD5SUM FROM DATABASECHANGELOG WHERE MD5SUM IS NOT NULL
[INFO] SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = 'PUBLIC' AND IS_GENERATED=FALSE
[INFO] ALTER TABLE "USERS_ROLES" DROP CONSTRAINT "FKA62J07K5MHGIFPP955H37PONJ"
[INFO] ALTER TABLE "USERS_ROLES" DROP CONSTRAINT "FKML90KEF4W2JY7OXYQV742TSFC"
[INFO] DROP TABLE "ROLES" CASCADE
[INFO] DROP TABLE "USERS" CASCADE
[INFO] DROP TABLE "USERS_ROLES" CASCADE
[INFO] DROP SEQUENCE "HIBERNATE_SEQUENCE"
[INFO] SELECT COUNT(*) FROM "DATABASECHANGELOG"
[INFO] SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = 'PUBLIC' AND IS_GENERATED=FALSE
[INFO] DROP TABLE "DATABASECHANGELOG"
[INFO] SELECT COUNT(*) FROM "DATABASECHANGELOGLOCK"
[INFO] SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = 'PUBLIC' AND IS_GENERATED=FALSE
[INFO] DROP TABLE "DATABASECHANGELOGLOCK"
[INFO] Successfully deleted all supported object types in schema MYDB.PUBLIC.
[INFO] SELECT COUNT(*) FROM DATABASECHANGELOGLOCK
[INFO] Successfully released change log lock
[INFO] SELECT COUNT(*) FROM DATABASECHANGELOGLOCK
[INFO] SELECT COUNT(*) FROM DATABASECHANGELOGLOCK
[INFO] CREATE TABLE DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))
[INFO] SELECT COUNT(*) FROM DATABASECHANGELOGLOCK
[INFO] DELETE FROM DATABASECHANGELOGLOCK
[INFO] INSERT INTO DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, FALSE)
[INFO] SELECT LOCKED FROM DATABASECHANGELOGLOCK WHERE ID=1
[INFO] Successfully acquired change log lock
[INFO] Creating database history table with name: DATABASECHANGELOG
[INFO] CREATE TABLE DATABASECHANGELOG (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED TIMESTAMP NOT NULL, ORDEREXECUTED INT NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20), CONTEXTS VARCHAR(255), LABELS VARCHAR(255), DEPLOYMENT_ID VARCHAR(10))
[INFO] SELECT COUNT(*) FROM DATABASECHANGELOG
[INFO] Reading from DATABASECHANGELOG
[INFO] SELECT * FROM DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC
[INFO] SELECT COUNT(*) FROM DATABASECHANGELOGLOCK
[INFO] CREATE SEQUENCE hibernate_sequence START WITH 1 INCREMENT BY 1
[INFO] Sequence hibernate_sequence created
[INFO] ChangeSet src/main/resources/db/db.changelog-master.xml::1586424252672-1::guillaume (generated) ran successfully in 1ms
[INFO] SELECT MAX(ORDEREXECUTED) FROM DATABASECHANGELOG
[INFO] INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1586424252672-1', 'guillaume (generated)', 'src/main/resources/db/db.changelog-master.xml', NOW(), 1, '8:66d339bfb0b07ca6736080b2bc5a37fd', 'createSequence sequenceName=hibernate_sequence', '', 'EXECUTED', NULL, NULL, '3.8.8', '6426007837')
[INFO] CREATE TABLE roles (id BIGINT AUTO_INCREMENT NOT NULL, name VARCHAR(255), CONSTRAINT rolesPK PRIMARY KEY (id))
[INFO] Table roles created
[INFO] ChangeSet src/main/resources/db/db.changelog-master.xml::1586424252672-2::guillaume (generated) ran successfully in 8ms
[INFO] INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1586424252672-2', 'guillaume (generated)', 'src/main/resources/db/db.changelog-master.xml', NOW(), 2, '8:17657767c173987f2e62f851045cf36b', 'createTable tableName=roles', '', 'EXECUTED', NULL, NULL, '3.8.8', '6426007837')
[INFO] CREATE TABLE users (id BIGINT AUTO_INCREMENT NOT NULL, email VARCHAR(255), password VARCHAR(255), username VARCHAR(255), CONSTRAINT usersPK PRIMARY KEY (id))
[INFO] Table users created
[INFO] ChangeSet src/main/resources/db/db.changelog-master.xml::1586424252672-3::guillaume (generated) ran successfully in 2ms
[INFO] INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1586424252672-3', 'guillaume (generated)', 'src/main/resources/db/db.changelog-master.xml', NOW(), 3, '8:abc049d7f160d8f2ebe63c47f04ca661', 'createTable tableName=users', '', 'EXECUTED', NULL, NULL, '3.8.8', '6426007837')
[INFO] CREATE TABLE users_roles (users_id BIGINT NOT NULL, roles_id BIGINT NOT NULL)
[INFO] Table users_roles created
[INFO] ChangeSet src/main/resources/db/db.changelog-master.xml::1586424252672-4::guillaume (generated) ran successfully in 1ms
[INFO] INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1586424252672-4', 'guillaume (generated)', 'src/main/resources/db/db.changelog-master.xml', NOW(), 4, '8:0c8727effea9ab83bdcc13622c7ca189', 'createTable tableName=users_roles', '', 'EXECUTED', NULL, NULL, '3.8.8', '6426007837')
[INFO] ALTER TABLE users_roles ADD CONSTRAINT UK_60loxav507l5mreo05v0im1lq UNIQUE (roles_id)
[INFO] Unique constraint added to users_roles(roles_id)
[INFO] ChangeSet src/main/resources/db/db.changelog-master.xml::1586424252672-5::guillaume (generated) ran successfully in 2ms
[INFO] INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1586424252672-5', 'guillaume (generated)', 'src/main/resources/db/db.changelog-master.xml', NOW(), 5, '8:30306ec581c26dba9ecde39bf0141d56', 'addUniqueConstraint constraintName=UK_60loxav507l5mreo05v0im1lq, tableName=users_roles', '', 'EXECUTED', NULL, NULL, '3.8.8', '6426007837')
[INFO] ALTER TABLE users_roles ADD CONSTRAINT FKa62j07k5mhgifpp955h37ponj FOREIGN KEY (roles_id) REFERENCES roles (id)
[INFO] Foreign key constraint added to users_roles (roles_id)
[INFO] ChangeSet src/main/resources/db/db.changelog-master.xml::1586424252672-6::guillaume (generated) ran successfully in 2ms
[INFO] INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1586424252672-6', 'guillaume (generated)', 'src/main/resources/db/db.changelog-master.xml', NOW(), 6, '8:ca9ca0256e56bebbacbd8374536a7ed5', 'addForeignKeyConstraint baseTableName=users_roles, constraintName=FKa62j07k5mhgifpp955h37ponj, referencedTableName=roles', '', 'EXECUTED', NULL, NULL, '3.8.8', '6426007837')
[INFO] ALTER TABLE users_roles ADD CONSTRAINT FKml90kef4w2jy7oxyqv742tsfc FOREIGN KEY (users_id) REFERENCES users (id)
[INFO] Foreign key constraint added to users_roles (users_id)
[INFO] ChangeSet src/main/resources/db/db.changelog-master.xml::1586424252672-7::guillaume (generated) ran successfully in 4ms
[INFO] INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1586424252672-7', 'guillaume (generated)', 'src/main/resources/db/db.changelog-master.xml', NOW(), 7, '8:7faf3d05ea683ed234fa2d1d628fd2da', 'addForeignKeyConstraint baseTableName=users_roles, constraintName=FKml90kef4w2jy7oxyqv742tsfc, referencedTableName=users', '', 'EXECUTED', NULL, NULL, '3.8.8', '6426007837')
[INFO] Successfully released change log lock
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ liquibase-demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 4 source files to /Users/guillaume/Developer/UQTR/INF1013/services/liquibase-demo/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ liquibase-demo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/guillaume/Developer/UQTR/INF1013/services/liquibase-demo/src/test/resources
[INFO] 
[INFO] --- liquibase-maven-plugin:3.8.8:diff (generate-db-diff) @ liquibase-demo ---
[INFO] ------------------------------------------------------------------------
[INFO] Parsing Liquibase Properties File
[INFO]   File: src/main/resources/liquibase.properties
[INFO]   'outputChangeLogFile' in properties file is not being used by this task.
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] 
[INFO] Liquibase Community 3.8.8 by Datical
[INFO] Starting Liquibase at jeu., 09 avr. 2020 05:53:28 EDT (version 3.8.8 #66 built at Thu Mar 19 08:17:43 UTC 2020)
[INFO] Parsing Liquibase Properties File src/main/resources/liquibase.properties for changeLog parameters
[INFO] Executing on Database: jdbc:h2:file:classpath://mydb
[WARNING] Namespace of the [javax.xml.bind.annotation.XmlSchema] annotation does not match [http://www.hibernate.org/xsd/orm/hbm]. Processing bindings will probably fail.
[INFO] Reading hibernate configuration hibernate:spring:com.liquibaseexample.liquibasedemo.models?dialect=org.hibernate.dialect.H2Dialect
[INFO] Found package com.liquibaseexample.liquibasedemo.models
[INFO] HHH000204: Processing PersistenceUnitInfo [name: default]
[INFO] HHH000412: Hibernate Core {5.4.4.Final}
[INFO] HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
[WARNING] HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections
[WARNING] HHH000342: Could not obtain connection to query metadata : The application must supply JDBC connections
[INFO] HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
[INFO] Envers integration enabled? : true
[INFO] HHH10005002: No explicit CDI BeanManager reference was passed to Hibernate, but CDI is available on the Hibernate ClassLoader.
[INFO] HV000001: Hibernate Validator 6.0.18.Final
[INFO] HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
[INFO] HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
[INFO] Using dialect org.hibernate.dialect.H2Dialect
[INFO] Performing Diff on database  @ jdbc:h2:file:classpath://mydb (Default Schema: PUBLIC)
[INFO] Found table profiles
[INFO] Found table profiles
[INFO] Found table users
[INFO] Found table users
[INFO] Found table roles
[INFO] Found table roles
[INFO] Found table users_roles
[INFO] Found table users_roles
[INFO] Found table profiles
[INFO] Found primary key profilesPK
[INFO] Found column id bigint
[INFO] Found column firstname varchar(255)
[INFO] Found column lastname varchar(255)
[INFO] Found table roles
[INFO] Found primary key rolesPK
[INFO] Found column id bigint
[INFO] Found column name varchar(255)
[INFO] Found table users
[INFO] Found primary key usersPK
[INFO] Found column id bigint
[INFO] Found column email varchar(255)
[INFO] Found column password varchar(255)
[INFO] Found column username varchar(255)
[INFO] Found table users_roles
[INFO] Found unique constraint UK_60loxav507l5mreo05v0im1lq on users_roles(roles_id)
[INFO] Found column users_id bigint
[INFO] Found column roles_id bigint
[INFO] SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = 'PUBLIC' AND IS_GENERATED=FALSE
[INFO] select CONSTRAINT_NAME, COLUMN_LIST as COLUMN_NAME from information_schema.constraints where constraint_type='UNIQUE' and constraint_catalog='MYDB' and constraint_schema='PUBLIC' and table_name='USERS_ROLES' and constraint_name='UK_60LOXAV507L5MREO05V0IM1LQ'
[INFO] src/main/resources/db/db.changelog-master.xml exists, appending
[INFO] Differences written to Change Log File, src/main/resources/db/db.changelog-master.xml
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ liquibase-demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/guillaume/Developer/UQTR/INF1013/services/liquibase-demo/target/test-classes
[INFO] 
[INFO] <<< spring-boot-maven-plugin:2.2.6.RELEASE:run (default-cli) < test-compile @ liquibase-demo <<<