当前位置: 首页 > 知识库问答 >
问题:

JOOQ为视图生成DAO

郗河
2023-03-14

我试图自动生成刀的视图。我已经预先设置了配置:

                            <generate>
                                <!--<deprecated>false</deprecated>-->
                                <daos>true</daos>
                            </generate>

whitch为表生成dao,但不为视图生成dao。根据文件规定:

如果您使用的是jOOQ的代码生成器,那么可以将其配置为为为您生成POJO和DAO。然后,jOOQ为每个UpdateRecord生成一个DAO,即为每个表生成一个单列主键。

公共接口

它表示来自表或视图的记录-表记录其基础表或视图具有“主唯一键”,即主键或至少一个唯一键jOOQ使用“主唯一键”执行可在可更新记录上执行的各种操作:

Witch基本上意味着DAO是为可更新的记录生成的,可更新的记录可以由表和视图生成。但是,不会为我的视图生成UpdateableRecord和键。有可能在视图上实现这一点吗?或者它不是故意的?

以下是我的一个观点

CREATE OR REPLACE VIEW test AS 
 SELECT test_table.id, test_table.test_id, test_table.foo
   FROM private.test_table;

ALTER TABLE test
  OWNER TO postgres;
GRANT ALL ON TABLE test TO postgres;
GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE test TO viewers;


CREATE OR REPLACE RULE "TEST_INSERT" AS
    ON INSERT TO test DO INSTEAD  INSERT INTO private.test_table (test_id, foo) 
  VALUES (new.test_id, new.foo);

CREATE OR REPLACE RULE "TEST_UPDATE" AS
    ON UPDATE TO test DO INSTEAD  UPDATE private.test_table SET test_id = new.test_id, foo = new.foo
  WHERE test_table.id = old.id;

P. S.

我自己怀疑它与文档中提到的“main unique key”有关,因为keys类中没有生成键。

使现代化

在收到一个有希望的答案后,下面是我的配置条目:

        <plugin>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen-maven</artifactId>
            <version>3.4.2</version>

            <dependencies>
                <dependency>
                    <groupId>postgresql</groupId>
                    <artifactId>postgresql</artifactId>
                    <version>9.1-901-1.jdbc4</version>
                </dependency>
            </dependencies>

            <executions>
                <execution>
                    <id>regenerate-jooq-sources</id>
                    <phase>clean</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>

                    <configuration>

                        <!-- JDBC connection parameters -->
                        <jdbc>
                            <driver>org.postgresql.Driver</driver>
                            <url>
                                jdbc:postgresql://localhost:5432/core
                            </url>
                            <user>client</user>
                            <password>***</password>
                        </jdbc>

                        <!-- Generator parameters -->
                        <generator>
                            <name>org.jooq.util.DefaultGenerator</name>
                            <database>
                                <syntheticPrimaryKeys>SCHEMA\.TABLE\.COLUMN(1|2)</syntheticPrimaryKeys>
                                <overridePrimaryKeys>overrid_primmary_key</overridePrimaryKeys>
                                <name>
                                    org.jooq.util.postgres.PostgresDatabase
                                </name>
                                <includes>.*</includes>
                                <excludes></excludes>
                                <inputSchema>public</inputSchema>
                            </database>
                            <generate>
                                <!--<deprecated>false</deprecated>-->
                                <daos>true</daos>
                                <interfaces>true</interfaces>
                            </generate>

                            <target>

                                <packageName>
                                    com.rfid.server.jooq
                                </packageName>
                                <directory>
                                    ${basedir}/src/main/java/
                                </directory>
                            </target>
                        </generator>
                    </configuration>
                </execution>
            </executions>
        </plugin>

共有2个答案

赫连瀚
2023-03-14

从jOOQ 3.5开始,jOOQ的代码生成器尚未检测到视图的底层主键信息(如果存在此类信息)。很少有数据库能够真正可靠地提供此类信息,因此,您引用的Javadoc可能有点误导。有关该主题的更多信息,请参见本问题:

如何从Oracle视图中发现基础主(或唯一)键列

但是,您可以使用

<!-- A regular expression matching all columns that participate in "synthetic" primary
      keys, which should be placed on generated UpdatableRecords, to be used with

      - UpdatableRecord.store()
      - UpdatableRecord.update()
      - UpdatableRecord.delete()
      - UpdatableRecord.refresh()

     Synthetic primary keys will override existing primary keys. -->
<syntheticPrimaryKeys>SCHEMA\.TABLE\.COLUMN(1|2)</syntheticPrimaryKeys>

<!-- All (UNIQUE) key names that should be used instead of primary keys on
     generated UpdatableRecords, to be used with

      - UpdatableRecord.store()
      - UpdatableRecord.update()
      - UpdatableRecord.delete()
      - UpdatableRecord.refresh()

      If several keys match, a warning is emitted and the first one encountered will
      be used.

      This flag will also replace synthetic primary keys, if it matches. -->
<overridePrimaryKeys>MY_UNIQUE_KEY_NAME</overridePrimaryKeys>

设置这些标志将把您生成的记录转换为Up数据库记录,从而也将生成相应的DAO

关于这些代码生成标志的更多信息可以在这里找到:

http://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/

华展鹏
2023-03-14

在Lukas Eder答案的帮助下,我解决了它,以下是配置的重要部分:

                            <database>
                                <!--force generating id'sfor everything in public schema, that has an 'id' field-->
                                <syntheticPrimaryKeys>public\..*\.id</syntheticPrimaryKeys>
                                <!--name for fake primary key-->
                                <overridePrimaryKeys>override_primmary_key</overridePrimaryKeys>
                                <name>
                                    org.jooq.util.postgres.PostgresDatabase
                                </name>
                                <includes>.*</includes>
                                <excludes></excludes>
                                <inputSchema>public</inputSchema>
                            </database>
                            <generate>
                                <daos>true</daos>
                            </generate>
 类似资料:
  • 我更改了数据库中的一些表,所以我想生成记录、键、类等。但是每次我这样做时,它总是跳过jooq代码生成。 [INFO]--jooq-codegen-maven:3.11.10:generate(默认cli)@http网关--[INFO]跳过jooq代码生成 为了运行Jooq代码生成,我应该执行哪个mvn cmd?现在我使用: 谢谢

  • 有时,当函数具有这样的签名时,它可能会变得毛茸茸的: 对于编译器来说,所有UUID都是相同的,因此希望在运行时被数据库捕获。 我喜欢jOOQ在编译时捕获许多问题的方式,我也想解决这个问题。我的目标是让每个表的每个键都有自己的类,并让这些字段正确生成pojos。 实现这一目标的最佳方法是什么?我想出了以下几点: 全面的JavaGenerator实现 具有大量强制类型映射的转换器,以及手动创建的键类

  • 问题内容: 我正在尝试将jOOQ包含在我的代码中,但是未生成任何代码。 执行时,不会生成任何源。我希望它创建一个在以下-file文件中定义的类。 我的pom.xml文件如下所示: 我假设应该使用适当的类来创建目录。Maven构建成功运行,没有任何错误。 您可以在此GitHub存储库中找到整个项目。 问题答案: 您正在使用内存数据库:。jOOQ代码生成器启动时,它将接收到一个空的 新 数据库,而不是

  • 我使用jOOQ程序代码生成数据库,但现在我遇到了一些问题。在数据库中,我有表A和表B。第一次都生成了pojo、dao、接口等。经过一段时间的开发,我发现表A需要添加一些字段或修改一些字段,所以我不得不再次编码,然后jOOQ代码生成器将覆盖现有的代码,这让我很难过。当我在排除表的情况下使用“排除A”时,发现只生成了表A的数据,表B将被删除。我不知道如何处理这个问题。我的代码生成器如下:

  • Jooq不生成类。我使用gradle插件https://github.com/etiennestuder/gradle-jooq-plugin使用postgresql 42.2.24。我的问题是什么?这是我的身材 输出任务:生成Jooq 在2s中成功构建1个可操作任务:1个已执行

  • 是否有任何参数可以在jooq代码生成期间打开/关闭下一个查询的执行? 在有大量模式和对象的数据库上,执行大约需要一个小时