当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot使用复合键生成JOOQ

步嘉德
2023-03-14

我正在尝试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关系,如以下表所示:

这里使用的表格,详细说明tbladdservicecon

JOOQ生成的所有内容都是正确的,但是对于连接实体,它无法让Spring清楚密钥是什么。

由于这个问题导致应用程序因上述错误而停止,我无法将JOOQ与Spring一起使用。我直到现在才使用这个enity(但稍后会使用)。还是有办法绕过这个错误?

共有1个答案

徐阳炎
2023-03-14

Lukas Eder回答了这个问题(见评论):

  1. 可以使用JOOQ生成POJO,但结果不被视为JPA的输入
  2. 我们的想法是根据需要同时使用它们(以及Spring),但不要使用其中一种并将其与另一种混合

Thorben Janssen在其关于Java的优秀思想:Hibernate中给出了JOOQ和Hibernate良好结合的提示

 类似资料:
  • 我为这个特殊的问题找了很多,但我没有找到任何具体的解决办法。我在一个表中有一个复合主键,这个复合主键的一个字段是另一个表的复合主键的一部分。您可以说这个特定的字段是第二个表中的外键,但是在表定义中没有定义任何独占外键约束。对于第一个表中的每个rec,第二个表中可能有多条记录。我试图使用SPringBoot-JPA-Hibernate实现这一点,但无法实现。有人能帮我吗。以下是德泰:- 我有一个US

  • 有时,当函数具有这样的签名时,它可能会变得毛茸茸的: 对于编译器来说,所有UUID都是相同的,因此希望在运行时被数据库捕获。 我喜欢jOOQ在编译时捕获许多问题的方式,我也想解决这个问题。我的目标是让每个表的每个键都有自己的类,并让这些字段正确生成pojos。 实现这一目标的最佳方法是什么?我想出了以下几点: 全面的JavaGenerator实现 具有大量强制类型映射的转换器,以及手动创建的键类

  • 问题内容: 如何使用复合主键作为外键?看来我的尝试无效。 问题答案: 该行: 是错的。您不能那样使用,这只是父表中PK约束的名称。要将复合主键用作外键,您必须向子表中添加相同数量(组成PK)的相同数据类型的列,然后在定义中使用这些列的组合:

  • 如何将复合主键用作外键?看来我的尝试没有成功。

  • 我试图增加我的MySQL数据库模式的约束,为每个表添加外键约束。 表1:用户 INT(11)UNSIGNED NOT NULL AUTO_INCREMENT username`VARCHAR(50)不为空 主键() 表2:磁盘(这与用户有一对多的关系) INT(11)UNSIGNED NOT NULL AUTO_INCREMENT INT(11)不为空, 主键(,)索引(ASC) 约束 外键()

  • 我知道这似乎已经讨论过了,答案是肯定的,可以为不同的字符串生成相同的值,但不太可能(Java的hashCode可以为不同的字符串生成相同的值吗?)。然而,它确实发生在我的应用程序中。 以下代码将生成相同的hashcode:-347019262(jave 1.7.25) 在这种情况下,我确实需要hashcode,我希望使用它为字符串生成唯一的主键。看来我做得不对。有什么建议吗? 多谢!