I want jOOQ to auto-generate code based on the liquibase schema xml file that I have provided (not on basis of db connection). If I change something in liquibase xml file, the change reflects in the database, but I am not able the new auto-generated code. I have to run mvn clean compile twice in order for jOOQ to understand the change.
The generator part of my pom.xml looks like this. Please help:
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.16.3.xsd">
<jdbc>
<driver>org.postgresql.Driver</driver>
<url>${spring.datasource.url}</url>
<user>${spring.datasource.username}</user>
<password>${spring.datasource.password}</password>
</jdbc>
<generator>
<database>
<name>org.jooq.meta.extensions.liquibase.LiquibaseDatabase</name>
<name>org.jooq.meta.postgres.PostgresDatabase</name>
<properties>
<!-- Specify the classpath location of your XML, YAML, or JSON script. -->
<property>
<key>scripts</key>
<value>liquibase-outputChangeLog.xml</value>
</property>
<!-- Whether you want to include liquibase tables in generated output
- false (default)
- true: includes DATABASECHANGELOG and DATABASECHANGELOGLOCK tables -->
<property>
<key>includeLiquibaseTables</key>
<value>true</value>
</property>
<!-- Properties prefixed "database." will be passed on to the liquibase.database.Database class
if a matching setter is found -->
<!-- The property "changeLogParameters.contexts" will be passed on to the
liquibase.database.Database.update() call (jOOQ 3.13.2+).
See https://www.liquibase.org/documentation/contexts.html -->
<property>
<key>changeLogParameters.contexts</key>
<value>!test</value>
</property>
</properties>
<inputSchema>public</inputSchema>
</database>
</generator>
</configuration>
The problem your question is about
By adding the
PostgresDatabase
in addition to theLiquibaseDatabase
, you just override theLiquibaseDatabase
configuration for that<name/>
element. You can't specify multiple of those.The problem you were trying to solve
Please look at the documentation for jOOQ's
LiquibaseDatabase
. It mentions that thescripts
property should describe a classpath location of your migration file, not a relative path location, e.g.(Note the slash at the beginning). Starting from jOOQ 3.16.5, which addresses an incompatible change within Liquibase itself (see #13031), you can now use relative paths along with an additional
rootPath
specification, which is required since Liquibase 4.0:More longterm solution using an actual database
While the
LiquibaseDatabase
can help speed things up when your database is simple, as soon as you're using vendor specific features (stored procedures, data types, etc.), that approach isn't viable anymore. Running your migration on an actual PostgreSQL database, and then generating code from that would be much better. You could use testcontainers for that, as explained in this blog post.