JOOQ使用Spring Boot用复合键生成

时间:2018-10-13 15:35:03

标签: spring-boot jooq

我正在尝试JOOQ生成数据库架构以将其与spring-boot一起使用。 我正在使用以下Maven配置:

<!-- Generator parameters -->
<generator>
    <!-- The default code generator. You can override this one, to generate your own code style
         Defaults to org.jooq.codegen.JavaGenerator -->
    <name>org.jooq.codegen.JavaGenerator</name>

    <!-- The naming strategy used for class and field names.
         You may override this with your custom naming strategy. Some examples follow
         Defaults to org.jooq.codegen.DefaultGeneratorStrategy -->

    <database>
        <name>org.jooq.meta.postgres.PostgresDatabase</name>
        <!--<name>org.jooq.codegen.JavaGenerator</name>-->
        <includes>.*</includes>
        <excludes></excludes>
        <inputSchema>public</inputSchema>
    </database>
    <target>
        <packageName>org.jooq.codegen.maven.engletter</packageName>
        <directory>target/generated-sources/jooq</directory>

    </target>
    <generate>
        <javaTimeTypes>true</javaTimeTypes>
        <validationAnnotations>true</validationAnnotations>
        <springAnnotations>true</springAnnotations>
        <pojosToString>true</pojosToString>
        <jpaAnnotations>true</jpaAnnotations>
    </generate>
    <strategy>
        <name>org.jooq.codegen.DefaultGeneratorStrategy</name>
        <matchers>
            <tables>
                <table>
                    <recordImplements>ch.rsmch.backend.data.entity.TblEntity</recordImplements>
                </table>
            </tables>
        </matchers>
    </strategy>
</generator>

这对于具有单个键的实体非常有效。它为表tbladdservice生成如下代码:

/**
 * Getter for <code>public.tbladdservice.id</code>. key
 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false, precision = 64)
public Long getId() {
    return (Long) get(0);
}

但是对于具有复合键(称为tbladdservicecon)的表,它只会生成:

// -------------------------------------------------------------------------
// Primary key information
// -------------------------------------------------------------------------

/**
 * {@inheritDoc}
 */
@Override
public Record2<Long, Long> key() {
    return (Record2) super.key();
}

此问题(据我了解):@Id丢失。 如果我在打电话

mvn spring-boot:run

我遇到此错误(并且应用程序无法启动):

CreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: org.jooq.codegen.maven.engletter.tables.records.TbladdserviceconRecord

是否可以说服JOOQ生成@Id语句?

非常感谢您的帮助。

要使之更清楚:
我有一个包含35个实体的PostgreSQL架构,其中一些实体创建为连接器,以打破m:m的关系,如此处的表所示:

Tables used here, in detail tbladdservicecon

JOOQ会正确生成所有东西,但是对于连接实体,它无法使Spring清楚密钥是什么。

由于此问题停止了上述错误的处理,因此我无法在Spring中使用JOOQ。直到现在我都没有使用这种实体(但是稍后会使用它)。还是有办法解决这个错误?

1 个答案:

答案 0 :(得分:0)

卢卡斯·埃德(Lukas Eder)回答了这个问题(见评论):

  1. 可以用JOOQ生成POJO,但是结果不认为是JPA的输入。
  2. 想法是根据需要同时使用它们(也可以使用Spring),但不要同时使用它们和将其混合使用。

Thorben Janssen在其关于Java的出色思想中给出了JOOQ和Hibernate良好结合的提示: Hibernate & jOOQ – A Match Made in Heaven