我正在尝试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(但稍后会使用)。还是有办法绕过这个错误?
Lukas Eder回答了这个问题(见评论):
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,我希望使用它为字符串生成唯一的主键。看来我做得不对。有什么建议吗? 多谢!