2014-12-08 2 views
2

Im пытается автогенерировать dao для просмотра. Я предварительно установил конфигурацию:JOOQ генерирует DAO для просмотра

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

whitch генерирует dao для таблиц, но не для просмотров. Согласно документации говорится:

Если вы используете генератор кода jOOQ, вы можете настроить его, чтобы генерировать POJO, и объектов DAO для вас. Затем jOOQ генерирует один DAO для UpdatableRecord, то есть для таблицы с первичным ключом с одним столбцом.

и

общедоступный интерфейс UpdatableRecord<R extends UpdatableRecord<R>> расширяет TableRecord<R> Общий интерфейс для записей, которые могут быть сохранены обратно в базу данных снова. Любая запись может быть обновляемой, если

она представляет собой запись из таблицы или представлений - это TableRecord его базовой таблицы или представление имеет «главный уникальный ключ», то есть первичный ключ или, по меньшей мере, один уникальный ключ продукт " основной уникальный ключ»используется jOOQ для выполнять различные операции, которые могут быть выполнены на UpdatableRecord:

Ведьма в основном означает, что 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.

У меня есть собственное подозрение, что что-то делать с «основной уникальный ключ» упоминается в документации, потому что никакие ключи не генерируются в Keys класса.

UPDATE

После многообещающего ответ я получил, вот моя запись конфигурации:

 <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

Вы не * действительно * сохраняете '<синтетическиеPrimaryKeys> SCHEMA \ .TABLE \ .COLUMN (1 | 2)' так, не так ли? Вы должны указать регулярное выражение, соответствующее вашим фактическим именам столбцов ... –

ответ

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/

+0

Похоже, что это jusst, что я ищу –

+0

Я не знаю, что я делаю неправильно, но теперь он просто генерирует кучу данных для ** все ** схемы postgres, такие как pg_catalog, но все равно не работают с представлениями ... см. обновление моего вопроса для моего конфигурационного файла –

+0

Я предполагаю, что я испортил его с помощью элемента , возможно, мне нужно добавить полную конфигурацию отсюда: http://www.jooq.org/doc/3.4/manual-single-page/? ... –

3

С помощью ответа Лукаса Эдера я решил, что это важные части конфигурации:

      <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> 
+0

Вам, вероятно, не понадобится '' overridePrimaryKeys> 'config. Он соответствует существующему уникальному ключу и заменяет первичный ключ уникальным ключом ... –