这是对此SO Question的跟进问题。我正在使用jooq codegen从jpa实体自动生成jooq类。我打算使用jooq作为SQL查询构建器,并使用JPA EntityManager执行实际查询。但jooq正在从具有模式默认为PUBLIC的实体生成表。
例如,如果我的查询必须是
select SCHEMA_A.colA, SCHEMA_A.colB from SCHEMA_A.tableA;
jooq正在生成
select PUBLIC.colA, PUBLIC.colB from PUBLIC.tableA;
当我触发以下查询时,这使查询失败,因为架构无效。
entityManager.createNativeQuery(sqlString).getResultList();
我需要添加哪些配置才能使自动生成的代码包含实际的模式名称?
代码生成:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>3.9.1</version>
<!-- The plugin should hook into the generate goal -->
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta-extensions</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>com.yaswanth</groupId>
<artifactId>domain</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<configuration>
<!-- Generator parameters -->
<generator>
<database>
<name>org.jooq.util.jpa.JPADatabase</name>
<outputSchema>[SCHEMA_A]</outputSchema>
<properties>
<!-- A comma separated list of Java packages, that contain your entities -->
<property>
<key>packages</key>
<value>com.yaswanth.domain.entity</value>
</property>
</properties>
</database>
<target>
<packageName>com.yaswanth.domain.entity.jooq</packageName>
<directory>target/generated-sources/jooq</directory>
</target>
</generator>
</configuration>
</plugin>
</plugins>
</build>
jooq spring beans config
<bean id="dslContext" class="org.jooq.impl.DefaultDSLContext">
<constructor-arg ref="jooqConfig" />
</bean>
<bean id="jooqConfig" class="org.jooq.impl.DefaultConfiguration">
<property name="SQLDialect" value="MYSQL" />
<property name="dataSource" ref="myDataSource" />
<property name="settings" ref="settings"/>
</bean>
<bean id="settings" class="org.jooq.conf.Settings">
<property name="renderSchema" value="true" />
</bean>
答案 0 :(得分:1)
<outputSchema/>
元素不能单独使用,必须与<inputSchema/>
元素配对。原因是如果省略<inputSchema/>
元素,那么数据库中的所有模式都将用于代码生成,并且不清楚独立<outputSchema/>
元素的含义。
这个错误配置应该在日志文件中报告为警告:https://github.com/jOOQ/jOOQ/issues/6186
有关代码生成器架构映射功能的更多信息,请访问: https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-catalog-and-schema-mapping
注意:这就是jOOQ代码生成器的一般行为,JPADatabase
似乎有点特别的事实并不重要。即使使用JPA注释实体,例如,如果指定@Table(schema = "...")
,也可以拥有包含多个模式的数据库。