JPADatabase:从实体生成代码
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
许多 jOOQ 用户在主要使用 JPA 进行数据库交互的应用程序中使用 jOOQ 作为补充 SQL API,例如执行报表、批量处理、分析等。
在这种设置中,您可能有一个使用 JPA 注释实体实现的预先存在的模式。在开发时可能无法访问您的真实数据库模式,或者它不是您应用程序中的首要公民(即,您遵循 Java 优先的方法)。本节介绍如何从此 JPA 模型生成 jOOQ 类。考虑以下模型
@Entity
@Table(name = "author")
public class Author {
@Id
int id;
@Column(name = "first_name")
String firstName;
@Column(name = "last_name")
String lastName;
@OneToMany(mappedBy = "author")
Set<Book> books;
// Getters and setters...
}
@Entity
@Table(name = "book")
public class Book {
@Id
public int id;
@Column(name = "title")
public String title;
@ManyToOne
public Author author;
// Getters and setters...
}
现在,您可以不用将 jOOQ 代码生成器连接到保存上述模式表示的数据库,而是使用 jOOQ 的 JPADatabase 并将其提供给代码生成器。 JPADatabase 在内部使用 Hibernate,从您的实体生成内存中的 H2 数据库,并将该数据库反向工程回 jOOQ 类。
最简单的方法是使用 Maven 来包含 jooq-meta-extensions-hibernate 库(然后该库包含 H2 和 Hibernate 依赖项)
<dependency>
<!-- Use org.jooq for the Open Source Edition
org.jooq.pro for commercial editions with Java 21 support,
org.jooq.pro-java-17 for commercial editions with Java 17 support,
org.jooq.pro-java-11 for commercial editions with Java 11 support,
org.jooq.pro-java-8 for commercial editions with Java 8 support,
org.jooq.trial for the free trial edition with Java 21 support,
org.jooq.trial-java-17 for the free trial edition with Java 17 support,
org.jooq.trial-java-11 for the free trial edition with Java 11 support,
org.jooq.trial-java-8 for the free trial edition with Java 8 support
Note: Only the Open Source Edition is hosted on Maven Central.
Install the others locally using the provided scripts, or access them from here: https://repo.jooq.org
See the JDK version support matrix here: https://jooq.org.cn/download/support-matrix-jdk -->
<groupId>org.jooq</groupId>
<artifactId>jooq-meta-extensions-hibernate</artifactId>
<version>3.20.5</version>
</dependency>
dependencies {
// Use org.jooq for the Open Source Edition
// org.jooq.pro for commercial editions with Java 21 support,
// org.jooq.pro-java-17 for commercial editions with Java 17 support,
// org.jooq.pro-java-11 for commercial editions with Java 11 support,
// org.jooq.pro-java-8 for commercial editions with Java 8 support,
// org.jooq.trial for the free trial edition with Java 21 support,
// org.jooq.trial-java-17 for the free trial edition with Java 17 support,
// org.jooq.trial-java-11 for the free trial edition with Java 11 support,
// org.jooq.trial-java-8 for the free trial edition with Java 8 support
//
// Note: Only the Open Source Edition is hosted on Maven Central.
// Install the others locally using the provided scripts, or access them from here: https://repo.jooq.org
// See the JDK version support matrix here: https://jooq.org.cn/download/support-matrix-jdk
jooqCodegen("org.jooq:jooq-meta-extensions-hibernate:3.20.5")
}
dependencies {
// Use org.jooq for the Open Source Edition
// org.jooq.pro for commercial editions with Java 21 support,
// org.jooq.pro-java-17 for commercial editions with Java 17 support,
// org.jooq.pro-java-11 for commercial editions with Java 11 support,
// org.jooq.pro-java-8 for commercial editions with Java 8 support,
// org.jooq.trial for the free trial edition with Java 21 support,
// org.jooq.trial-java-17 for the free trial edition with Java 17 support,
// org.jooq.trial-java-11 for the free trial edition with Java 11 support,
// org.jooq.trial-java-8 for the free trial edition with Java 8 support
//
// Note: Only the Open Source Edition is hosted on Maven Central.
// Install the others locally using the provided scripts, or access them from here: https://repo.jooq.org
// See the JDK version support matrix here: https://jooq.org.cn/download/support-matrix-jdk
jooqCodegen "org.jooq:jooq-meta-extensions-hibernate:3.20.5"
}
在添加该依赖项后,您现在可以在代码生成器配置中指定 JPADatabase
<configuration>
<generator>
<database>
<name>org.jooq.meta.extensions.jpa.JPADatabase</name>
<properties>
<!-- A comma separated list of Java packages, that contain your entities -->
<property>
<key>packages</key>
<value>com.example.entities</value>
</property>
<!-- Whether JPA 2.1 AttributeConverters should be auto-mapped to jOOQ Converters.
Custom <forcedType/> configurations will have a higher priority than these auto-mapped converters.
This defaults to true. -->
<property>
<key>useAttributeConverters</key>
<value>true</value>
</property>
<!-- The default schema for unqualified objects:
- public: all unqualified objects are located in the PUBLIC (upper case) schema
- none: all unqualified objects are located in the default schema (default)
This configuration can be overridden with the schema mapping feature -->
<property>
<key>unqualifiedSchema</key>
<value>none</value>
</property>
</properties>
</database>
</generator>
</configuration>
有关更多详细信息,请参见配置 XSD、独立代码生成和maven 代码生成。
new org.jooq.meta.jaxb.Configuration()
.withGenerator(new Generator()
.withDatabase(new Database()
.withName("org.jooq.meta.extensions.jpa.JPADatabase")
.withProperties(
// A comma separated list of Java packages, that contain your entities
new Property()
.withKey("packages")
.withValue("com.example.entities"),
// Whether JPA 2.1 AttributeConverters should be auto-mapped to jOOQ Converters.
// Custom <forcedType/> configurations will have a higher priority than these auto-mapped converters.
// This defaults to true.
new Property()
.withKey("useAttributeConverters")
.withValue(true),
// The default schema for unqualified objects:
//
// - public: all unqualified objects are located in the PUBLIC (upper case) schema
// - none: all unqualified objects are located in the default schema (default)
//
// This configuration can be overridden with the schema mapping feature
new Property()
.withKey("unqualifiedSchema")
.withValue("none")
)
)
)
import org.jooq.meta.jaxb.*
configuration {
generator {
database {
name = "org.jooq.meta.extensions.jpa.JPADatabase"
properties {
// A comma separated list of Java packages, that contain your entities
property {
key = "packages"
value = "com.example.entities"
}
// Whether JPA 2.1 AttributeConverters should be auto-mapped to jOOQ Converters.
// Custom <forcedType/> configurations will have a higher priority than these auto-mapped converters.
// This defaults to true.
property {
key = "useAttributeConverters"
isValue = true
}
// The default schema for unqualified objects:
//
// - public: all unqualified objects are located in the PUBLIC (upper case) schema
// - none: all unqualified objects are located in the default schema (default)
//
// This configuration can be overridden with the schema mapping feature
property {
key = "unqualifiedSchema"
value = "none"
}
}
}
}
}
有关更多详细信息,请参见配置 XSD和gradle 代码生成。
configuration {
generator {
database {
name = "org.jooq.meta.extensions.jpa.JPADatabase"
properties {
// A comma separated list of Java packages, that contain your entities
property {
key = "packages"
value = "com.example.entities"
}
// Whether JPA 2.1 AttributeConverters should be auto-mapped to jOOQ Converters.
// Custom <forcedType/> configurations will have a higher priority than these auto-mapped converters.
// This defaults to true.
property {
key = "useAttributeConverters"
value = true
}
// The default schema for unqualified objects:
//
// - public: all unqualified objects are located in the PUBLIC (upper case) schema
// - none: all unqualified objects are located in the default schema (default)
//
// This configuration can be overridden with the schema mapping feature
property {
key = "unqualifiedSchema"
value = "none"
}
}
}
}
}
有关更多详细信息,请参见配置 XSD和gradle 代码生成。
// The jOOQ-codegen-gradle plugin has been introduced in version 3.19. // Please use the official plugin instead of the third party plugin that was recommended before.
以上将为您的 AUTHOR 和 BOOK 表生成所有 jOOQ 工件。
将设置传递给 Hibernate
当前版本的 jOOQ 在后台使用 Hibernate 生成内存中的 H2 数据库,从中反向工程 jOOQ 代码。为了影响 Hibernate 的模式生成,可以将 Hibernate 特定的标志传递给 MetadataSources。所有带有 hibernate. 或 jakarta.persistence. 前缀的属性都将传递给 Hibernate。例如,这都是可能的
<configuration>
<generator>
<database>
<properties>
<property>
<key>hibernate.physical_naming_strategy</key>
<value>org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy</value>
</property>
</properties>
</database>
</generator>
</configuration>
有关更多详细信息,请参见配置 XSD、独立代码生成和maven 代码生成。
new org.jooq.meta.jaxb.Configuration()
.withGenerator(new Generator()
.withDatabase(new Database()
.withProperties(
new Property()
.withKey("hibernate.physical_naming_strategy")
.withValue("org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy")
)
)
)
import org.jooq.meta.jaxb.*
configuration {
generator {
database {
properties {
property {
key = "hibernate.physical_naming_strategy"
value = "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"
}
}
}
}
}
有关更多详细信息,请参见配置 XSD和gradle 代码生成。
configuration {
generator {
database {
properties {
property {
key = "hibernate.physical_naming_strategy"
value = "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"
}
}
}
}
}
有关更多详细信息,请参见配置 XSD和gradle 代码生成。
// The jOOQ-codegen-gradle plugin has been introduced in version 3.19. // Please use the official plugin instead of the third party plugin that was recommended before.
如何组织您的依赖项
JPADatabase 将使用 Spring 从类路径中查找您的带注释的实体。这意味着您必须创建几个模块,其依赖关系图如下所示
+-------------------+
| Your JPA entities |
+-------------------+
^ ^
depends on | | depends on
| |
+---------------------+ +---------------------+
| jOOQ codegen plugin | | Your application |
+---------------------+ +---------------------+
| |
generates | | depends on
v v
+-------------------------+
| jOOQ generated classes |
+-------------------------+
您不能将 JPA 实体放在与运行 jOOQ 代码生成器的模块相同的模块中。另请参见代码生成依赖项。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!