JOOQ生成的类的架构默认为PUBLIC

时间:2017-05-04 11:16:02

标签: java jpa jooq codegen

这是对此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>

1 个答案:

答案 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 = "..."),也可以拥有包含多个模式的数据库。