Michael
Michael

Reputation: 2942

Generate changlog from JPA entities using Liquibase Maven plugin

I want to add Liquibase DB migration support to my project. It uses Spring Boot too. Now I want to generate the changelog without a DB connection just by using Hibernate and the JPA entity classes. But it throws an error:

mvn liquibase:generateChangeLog
[...]
Error setting up or running Liquibase: javax.persistence.PersistenceException: Unable to resolve persistence unit root URL: class path resource [] cannot be resolved to URL because it does not exist
[...]

I don't have a persistentunit XML file as this is all done by Spring Boot on runtime. The project is a multi module project. The Liquibase plugin config is in the parent POM. The entities are in a sub module.

This is the Maven plugin config for Liquibase:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <dependencies>
        <dependency>
            <groupId>org.liquibase.ext</groupId>
            <artifactId>liquibase-hibernate5</artifactId>
            <version>3.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
    </dependencies>
    <configuration>
        <url>hibernate:spring:org.kitodo.mediaserver.core.db.entities?dialect=liquibase.ext.hibernate.database.HibernateGenericDialect&amp;hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&amp;hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</url>
        <driver>liquibase.ext.hibernate.database.connection.HibernateDriver</driver>
    </configuration>
</plugin>

If I use a DB connection instead of hibernate:spring:... it works.

How to get the changelog generated without DB connection just by having the entities?

Upvotes: 2

Views: 2283

Answers (1)

Angelo
Angelo

Reputation: 2125

I had the same problem and to fix it, I have added the dependency of the maven project which contains your entities. For instance:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <dependencies>
        <dependency>
            <groupId>org.liquibase.ext</groupId>
            <artifactId>liquibase-hibernate5</artifactId>
            <version>3.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

        <!-- Add your maven project which hosts your entities classes -->
        <dependency>
            <groupId>org.kitodo.mediaserver</groupId>
            <artifactId>org.kitodo.mediaserver.core.db.entities</artifactId>
            <version>1.0.0</version>
        </dependency>

    </dependencies>
    <configuration>
        <url>hibernate:spring:org.kitodo.mediaserver.core.db.entities?dialect=liquibase.ext.hibernate.database.HibernateGenericDialect&amp;hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&amp;hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</url>
        <driver>liquibase.ext.hibernate.database.connection.HibernateDriver</driver>
    </configuration>
</plugin>

Upvotes: 1

Related Questions