Embedded H2 + JOOQ

0

Yo, pierwszy raz zabieram się za JOOQ i chcę, w ramach swojego małego projektu, korzystać z embedded H2 w Spring Boocie. Skonfigurowałem sobie 2 mavenowe pluginy, dodałem spring bootowe propertiesy i spodziewam się, że mi wygeneruje te swoje javowe klasy na podstawie tabelek z bazy. No niestety nic nie generuje... (chociaż jak robię mvn clean compile to jest success) (compile bo to faza generate-sources)

Mam plik schema.sql:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table(
  id               BIGINT        NOT NULL PRIMARY KEY,
  description           VARCHAR(250)  NOT NULL
);

Mam także pluginy mavenowe - jeden do wykonania skryptu sql:

<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>sql-maven-plugin</artifactId>
				<version>1.5</version>
				<executions>
					<execution>
						<phase>initialize</phase>
						<goals>
							<goal>execute</goal>
						</goals>
						<configuration>
							<driver>org.h2.Driver</driver>
							<url>jdbc:h2:mem:testdb</url>
							<username>sa</username>
							<password></password>
							<srcFiles>
								<srcFile>src/main/resources/schema.sql</srcFile>
							</srcFiles>
						</configuration>
					</execution>
				</executions>
				<dependencies>
					<dependency>
						<groupId>com.h2database</groupId>
						<artifactId>h2</artifactId>
						<version>1.4.191</version>
					</dependency>
				</dependencies>
			</plugin>

oraz plugin do generowania klas:

<plugin>
				<groupId>org.jooq</groupId>
				<artifactId>jooq-codegen-maven</artifactId>
				<executions>
					<execution>
						<phase>generate-sources</phase>
						<goals>
							<goal>generate</goal>
						</goals>
						<configuration>
							<jdbc>
								<driver>org.h2.Driver</driver>
								<url>jdbc:h2:mem:testdb</url>
								<user>sa</user>
								<password></password>
							</jdbc>
							<generator>
								<database>
									<name>
										org.jooq.meta.h2.H2Database
									</name>
									<includes>*.*</includes>
									<excludes></excludes>
									<inputSchema>PUBLIC</inputSchema>
								</database>
								<generate>
									<pojos>true</pojos>
									<pojosEqualsAndHashCode>
										true
									</pojosEqualsAndHashCode>
									<javaTimeTypes>true</javaTimeTypes>
									<fluentSetters>true</fluentSetters>
								</generate>
								<target>
									<packageName>
										com.pinek.jooq
									</packageName>
									<directory>
										target/generated-sources/jooq
									</directory>
								</target>
							</generator>
						</configuration>
					</execution>
				</executions>
			</plugin>

Oraz moje aplikacyjne propertiesy:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
        
jooq.sql.dialect=H2

No i po wykonaniu mvn clean compile jest success, ale w targecie nie ma nic wygenerowanego... :<

Druga sprawa, to w sumie nie do końca to ogarniam... H2 jest embedded in memory, czyli "żyje" tylko w trakcie trwania aplikacji. A tutaj jak robię te mvn clean compile to się robi niezależnie czy apka spring bootowa uruchomiona czy nie...

Any idea? Ktoś kiedykolwiek robił takie połączenie embedded H2 + JOOQ?

2
  1. Czy czytałeś dokumentację?
  2. Czy plugin rzeczywiście jest odpalany przy compile?
  3. Używasz bazy in-memory, tzn. najprawdopodobniej dostępnej tylko z procesu uruchomionej aplikacji. Output wykonania pluginu powinien dać więcej info.
  4. Nie możesz po prostu wygenerować klas z jakiegoś pliku schema.sql ze schematem? Po co dobijać się do bazy?
2

nie wiem czy Ci to pomoże ale dosłownie kilka dni temu zrobiłem refaktoryzację starego projektu gdzie wymieniłem JPA właśnie na jOOQ i H2 do testów, klasy jOOQ'a generowałem ręcznie za pomocą command line'a, repo

0
Charles_Ray napisał(a):
  1. Czy czytałeś dokumentację?

W sumie zacząłem dogłębnie analizować https://www.jooq.org/doc/latest/manual/code-generation/codegen-configuration/ i skorzystałem z org.jooq.meta.extensions.ddl.DDLDatabase :)

  1. Nie możesz po prostu wygenerować klas z jakiegoś pliku schema.sql ze schematem? Po co dobijać się do bazy?

Fakt! Przecież to jest zupełnie statyczne, nie potrzeba się dobijać do tej samej bazy danych. Dlatego nie ma znaczenia, czy apka spring bootowa jest odpalona czy nie.

Summa summarum, się wygenerowało :) Działający plugin:

<plugin>
				<groupId>org.jooq</groupId>
				<artifactId>jooq-codegen-maven</artifactId>
				<executions>
					<execution>
						<phase>generate-sources</phase>
						<goals>
							<goal>generate</goal>
						</goals>
						<configuration>
							<jdbc>
								<driver>org.h2.Driver</driver>
								<url>jdbc:h2:mem:testdb</url>
								<user>sa</user>
								<password></password>
							</jdbc>
							<generator>
								<target>
									<packageName>com.pinek.jooq</packageName>
									<directory>src/main/java</directory>
								</target>
								<database>
									<name>org.jooq.meta.extensions.ddl.DDLDatabase</name>
									<properties>
										<property>
											<key>scripts</key>
											<value>src/main/resources/schema.sql</value>
										</property>
									</properties>
								</database>
							</generator>
						</configuration>
					</execution>
				</executions>
			</plugin>

1 użytkowników online, w tym zalogowanych: 0, gości: 1