JOOQ为视图生成DAO

时间:2014-12-08 18:17:54

标签: java postgresql view dao jooq

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

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

whitch为表格生成dao,但不为视图生成dao。根据文件说明:

  

如果您正在使用jOOQ的代码生成器,则可以将其配置为   为您生成POJO和DAO。然后jOOQ生成一个DAO   UpdatableRecord,即每个表都有一个单列主键。

  

公共接口UpdatableRecord<R extends UpdatableRecord<R>>扩展   TableRecord<R>可以存储回来的记录的通用接口   再次到数据库。任何记录都可以更新,如果

     

它表示来自表或视图的记录 - TableRecord   基础表或视图具有“主要唯一密钥”,即主键   或至少一个唯一键jOOQ使用“主要唯一键”   执行可以执行的各种操作   UpdatableRecord:

Witch基本上意味着为可更新记录生成DAO,并且可以通过表和视图生成可更新记录。但是,我的视图不会生成UpdatableRecord和Keys。是否有可能在视野中实现这一点?或者它不是故意的?

这是我的一个观点

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。

我怀疑它与文档中提到的“主要唯一键”有关,因为类中没有生成键。

更新

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

        <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 个答案:

答案 0 :(得分:3)

在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>

答案 1 :(得分:1)

从jOOQ 3.5开始,如果存在此类信息,则jOOQ的代码生成器尚未检测到视图的基础主键信息。很少有数据库可以实际可靠地提供这样的信息,所以也许你引用的Javadoc可能有点误导。有关该主题的更多信息可以在这个问题中找到:

How to discover the underlying primary (or unique) key columns from an Oracle view

但是,您可以使用<syntheticPrimaryKeys>标志指定代码生成器的主键以生成其他密钥信息,也可以使用<overridePrimaryKeys>标志来使用放置的唯一键(物化)视图作为视图的主键。

<!-- 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>

设置这些标记会将生成的Records转换为UpdatableRecords,从而也会生成相应的DAOs

有关这些代码生成标志的更多信息,请访问:

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