我试图为视图自动生成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>
答案 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/