liquibase / liquibase-gradle-plugin

A Gradle plugin for Liquibase
Other
197 stars 57 forks source link

`diffChangeLog` stop working after Spring & Hibernate upgrade #113

Closed sitole closed 1 year ago

sitole commented 1 year ago

Hello, this week we started with upgrading project to Spring Boot 3, Hibernate 6. Project now works expect Liquibase Gradle migrations and we are trying to figure out.

Our configuration:

For development we are using Postgres 14 and our Liquibase configuration for migrations is:

liquibase {
    activities.register("main") {
        this.arguments = mapOf(
            "url" to "jdbc:postgresql://localhost/database-name",
            "username" to "database-username",
            "password" to "database-password",

            "driver" to "org.postgresql.Driver",
            "classpath" to "src/main",
            "changeLogFile" to "src/main/resources/db/main.xml"
        )
    }

    runList = "main"
}

After we try to run ./gradlew diffChangeLog there is error : [liquibase.integration] [PersistenceUnit: default] Unable to build Hibernate SessionFactory

and then continues with Suppressed: java.lang.UnsupportedOperationException: CteMutationStrategy can only be used with Dialects that support CTE that can take UPDATE or DELETE statements as well.

After project upgrade we experienced same issue with Spring app and was resolved because there was historically spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false. After setting this attribute to true (or remove) Spring app starts works. We tried same solution with Liquibase Gradle plugin (adding hibernate.temp.use_jdbc_metadata_defaults=true into referenceUrl but without any change).

Do you have any idea what should be point of this failure? Thanks!

Bigger part of stack trace:

[2023-01-22 20:53:38] SEVERE [liquibase.integration] [PersistenceUnit: default] Unable to build Hibernate SessionFactory
  - Caused by: PostInitCallback queue could not be processed...
        - PostInitCallbackEntry - Entity(com.example.services.domain.organizer.discounts.EventDiscount) `sqmMultiTableMutationStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.organizer.discounts.EventDiscount) `sqmMultiTableInsertStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.services.auth.AuthAuthority) `sqmMultiTableMutationStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.services.auth.AuthAuthority) `sqmMultiTableInsertStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.services.auth.variants.ServiceAuthAuthority) `sqmMultiTableMutationStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.services.auth.variants.ServiceAuthAuthority) `sqmMultiTableInsertStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.payment.transactions.TransactionBase) `sqmMultiTableMutationStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.payment.transactions.TransactionBase) `sqmMultiTableInsertStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.tt.TicketProduct) `sqmMultiTableMutationStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.tt.TicketProduct) `sqmMultiTableInsertStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.tt.tt.tdb.Example) `sqmMultiTableMutationStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.tt.tt.tdb.Example) `sqmMultiTableInsertStrategy` interpretation
        liquibase.exception.CommandExecutionException: liquibase.exception.DatabaseException: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
        at liquibase.command.CommandScope.execute(CommandScope.java:186)
        at liquibase.integration.commandline.CommandRunner.call(CommandRunner.java:55)
        at liquibase.integration.commandline.CommandRunner.call(CommandRunner.java:24)
        at picocli.CommandLine.executeUserObject(CommandLine.java:1953)
        at picocli.CommandLine.access$1300(CommandLine.java:145)
        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2352)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2346)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2311)
        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2179)
        at picocli.CommandLine.execute(CommandLine.java:2078)
        at liquibase.integration.commandline.LiquibaseCommandLine.lambda$execute$1(LiquibaseCommandLine.java:352)
        at liquibase.Scope.child(Scope.java:189)
        at liquibase.Scope.child(Scope.java:165)
        at liquibase.integration.commandline.LiquibaseCommandLine.execute(LiquibaseCommandLine.java:317)
        at liquibase.integration.commandline.LiquibaseCommandLine.main(LiquibaseCommandLine.java:84)
Caused by: liquibase.exception.DatabaseException: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
        at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject(CommandLineUtils.java:140)
        at liquibase.integration.commandline.Main.createReferenceDatabaseFromCommandParams(Main.java:2156)
        at liquibase.integration.commandline.Main.doMigration(Main.java:1566)
        at liquibase.integration.commandline.Main$1.lambda$run$0(Main.java:396)
        at liquibase.Scope.lambda$child$0(Scope.java:180)
        at liquibase.Scope.child(Scope.java:189)
        at liquibase.Scope.child(Scope.java:179)
        at liquibase.Scope.child(Scope.java:158)
        at liquibase.integration.commandline.Main$1.run(Main.java:395)
        at liquibase.integration.commandline.Main$1.run(Main.java:217)
        at liquibase.Scope.child(Scope.java:189)
        at liquibase.Scope.child(Scope.java:165)
        at liquibase.integration.commandline.Main.run(Main.java:217)
        at liquibase.command.AbstractCliWrapperCommandStep.run(AbstractCliWrapperCommandStep.java:32)
        at liquibase.command.CommandScope.execute(CommandScope.java:172)
        ... 14 more
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1509)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1430)
        at liquibase.ext.hibernate.database.HibernateEjb3Database.buildMetadataFromPath(HibernateEjb3Database.java:56)
        at liquibase.ext.hibernate.database.HibernateDatabase.buildMetadata(HibernateDatabase.java:133)
        at liquibase.ext.hibernate.database.HibernateDatabase.setConnection(HibernateDatabase.java:73)
        at liquibase.database.DatabaseFactory.findCorrectDatabaseImplementation(DatabaseFactory.java:124)
        at liquibase.database.DatabaseFactory.openDatabase(DatabaseFactory.java:144)
        at liquibase.integration.commandline.CommandLineUtils.createDatabaseObject(CommandLineUtils.java:94)
        ... 28 more
Caused by: java.lang.IllegalStateException: PostInitCallback queue could not be processed...
        - PostInitCallbackEntry - Entity(com.example.services.domain.organizer.discounts.EventDiscount) `sqmMultiTableMutationStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.organizer.discounts.EventDiscount) `sqmMultiTableInsertStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.services.auth.AuthAuthority) `sqmMultiTableMutationStrategy` interpretation
        - PostInitCallbackEntry - Entity(com.example.services.domain.services.auth.AuthAuthority) `sqmMultiTableInsertStrategy` interpretation

        at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.executePostInitCallbacks(MappingModelCreationProcess.java:146)
        at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.execute(MappingModelCreationProcess.java:90)
        at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.process(MappingModelCreationProcess.java:39)
        at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.finishInitialization(MappingMetamodelImpl.java:229)
        at org.hibernate.metamodel.internal.RuntimeMetamodelsImpl.finishInitialization(RuntimeMetamodelsImpl.java:60)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:311)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:415)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1425)
        ... 34 more
        Suppressed: java.lang.UnsupportedOperationException: CteMutationStrategy can only be used with Dialects that support CTE that can take UPDATE or DELETE statements as well
                at org.hibernate.query.sqm.mutation.internal.cte.CteMutationStrategy.<init>(CteMutationStrategy.java:80)
                at org.hibernate.query.sqm.mutation.internal.cte.CteMutationStrategy.<init>(CteMutationStrategy.java:64)
                at org.hibernate.dialect.PostgreSQLDialect.getFallbackSqmMutationStrategy(PostgreSQLDialect.java:821)
                at org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper.resolveStrategy(SqmMutationStrategyHelper.java:62)
                at org.hibernate.persister.entity.AbstractEntityPersister.interpretSqmMultiTableStrategy(AbstractEntityPersister.java:5957)
                at org.hibernate.persister.entity.AbstractEntityPersister.lambda$prepareMappingModel$11(AbstractEntityPersister.java:5792)
                at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess$PostInitCallbackEntry.process(MappingModelCreationProcess.java:210)
                at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.executePostInitCallbacks(MappingModelCreationProcess.java:108)
                ... 41 more
        Suppressed: java.lang.UnsupportedOperationException: CteInsertStrategy can only be used with Dialects that support CTE that can take UPDATE or DELETE statements as well
                at org.hibernate.query.sqm.mutation.internal.cte.CteInsertStrategy.<init>(CteInsertStrategy.java:123)
                at org.hibernate.query.sqm.mutation.internal.cte.CteInsertStrategy.<init>(CteInsertStrategy.java:107)
                at org.hibernate.dialect.PostgreSQLDialect.getFallbackSqmInsertStrategy(PostgreSQLDialect.java:828)
                at org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper.resolveInsertStrategy(SqmMutationStrategyHelper.java:87)
                at org.hibernate.persister.entity.AbstractEntityPersister.interpretSqmMultiTableInsertStrategy(AbstractEntityPersister.java:5972)
                at org.hibernate.persister.entity.AbstractEntityPersister.lambda$prepareMappingModel$12(AbstractEntityPersister.java:5825)
                at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess$PostInitCallbackEntry.process(MappingModelCreationProcess.java:210)
                at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.executePostInitCallbacks(MappingModelCreationProcess.java:108)
                ... 41 more
        Suppressed: java.lang.UnsupportedOperationException: CteMutationStrategy can only be used with Dialects that support CTE that can take UPDATE or DELETE statements as well
                at org.hibernate.query.sqm.mutation.internal.cte.CteMutationStrategy.<init>(CteMutationStrategy.java:80)
                at org.hibernate.query.sqm.mutation.internal.cte.CteMutationStrategy.<init>(CteMutationStrategy.java:64)
                at org.hibernate.dialect.PostgreSQLDialect.getFallbackSqmMutationStrategy(PostgreSQLDialect.java:821)
                at org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper.resolveStrategy(SqmMutationStrategyHelper.java:62)
                at org.hibernate.persister.entity.AbstractEntityPersister.interpretSqmMultiTableStrategy(AbstractEntityPersister.java:5957)
                at org.hibernate.persister.entity.AbstractEntityPersister.lambda$prepareMappingModel$11(AbstractEntityPersister.java:5792)
                at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess$PostInitCallbackEntry.process(MappingModelCreationProcess.java:210)
                at org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess.executePostInitCallbacks(MappingModelCreationProcess.java:108)
                ... 41 more
sitole commented 1 year ago

Related to Liquibase Hibernate repository: https://github.com/liquibase/liquibase-hibernate/issues/381