2017-05-04 2 views
1

これはSO Questionへのフォローアップの質問です。私はjpqエンティティからjooqクラスを自動生成するためにjooq codegenを使用しています。 jooqをSQL問合せビルダーとして使用し、JPA EntityManagerを使用して実際の問合せを実行する予定です。しかし、jooqは、スキーマがデフォルトのPUBLICのエンティティからテーブルを生成しています。例えば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(); 

自動生成されたコードに実際のスキーマ名が含まれるようにするには、どの設定を追加する必要がありますか?

codegenの:

<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春豆の設定

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

あなたは私のために2つのことを試すことができます:1) ''のスキーマ名から '[]'を削除し、2)XML要素 ' PUBLIC'を追加して何か変わる? –

+0

それは魅力のように動作します!私は[]の括弧をこの作業をする無駄な最後の試みとして含めました。 PUBLICスキーマを含めることが重要です。しかし、エンティティに関するメタデータ情報を格納するh2 dbがユーザによって処理されるはずであるということを考慮すれば、それは明らかではありませんか?つまり、 PUBLICが毎回のデフォルトであり、ユーザーに含めるべきではありません。 – yaswanth

+0

また、エンティティの@Tableアノテーションにスキーマプロパティを追加すると、そこからスキーマが検出されますか? – yaswanth

答えて

1

<outputSchema/>要素が一人で立つことができない、それは<inputSchema/>要素とペアにする必要があります。その理由は、<inputSchema/>要素を省略すると、データベース内のすべてのスキーマがコード生成に使用されるため、スタンドアロンの要素が意味するものは不明です。ここではコード・ジェネレータのスキーママッピング機能について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 = "...")を指定すると、いくつかのスキーマを含むデータベースを持つことができます。

関連する問題