java - JOOQ 没有生成类
问题描述
我对 JOOQ 框架(3.13.4)以及 Spring Boot 和 Java 8 有疑问。
问题是我正在尝试使用 java 代码方式生成域类(而不是使用带有自定义命名策略提供程序的一些麻烦的 maven 的 codegen 插件)。因此,首先让我向您展示包含(至少我相信它包含)所有必要 bean的@Configuration类:
import com.ormtester.common.base.Measurer;
import com.ormtester.common.utils.enums.OrmType;
import com.ormtester.datasources.config.RouteableDataSource;
import org.jooq.SQLDialect;
import org.jooq.codegen.GenerationTool;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.jooq.impl.DefaultExecuteListenerProvider;
import org.jooq.util.xml.jaxb.Schema;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.jooq.meta.jaxb.*;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.annotation.PostConstruct;
import java.util.Properties;
@Configuration
@EnableTransactionManagement
public class JooqConfigurator {
private Properties moduleProperties;
private RouteableDataSource routeableDataSource;
public JooqConfigurator(RouteableDataSource routeableDataSource) {
this.routeableDataSource = routeableDataSource;
try {
moduleProperties = new Properties();
moduleProperties.load(JooqConfigurator.class.getClassLoader()
.getResourceAsStream("jooq.properties"));
} catch (Exception ignore) {}
}
@Bean
public DataSourceConnectionProvider connectionProvider() {
return new DataSourceConnectionProvider(routeableDataSource);
}
@Bean
public ExceptionTranslator exceptionTransformer() {
return new ExceptionTranslator();
}
@Bean
public DefaultConfiguration configuration() {
DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
jooqConfiguration.set(connectionProvider());
jooqConfiguration.set(new DefaultExecuteListenerProvider(exceptionTransformer()));
jooqConfiguration.set(SQLDialect.DEFAULT);
return jooqConfiguration;
}
@Bean
public DefaultDSLContext dsl() {
return new DefaultDSLContext(configuration());
}
@PostConstruct
public void generateCode() {
try {
GenerationTool.generate(new org.jooq.meta.jaxb.Configuration()
.withJdbc(new Jdbc()
.withDriver("com.mysql.cj.jdbc.Driver")
.withUrl("jdbc:mysql://localhost:3306/ormtester?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC")
.withUser("root")
.withPassword("root123"))
.withGenerator(new Generator()
.withName("org.jooq.codegen.JavaGenerator")
.withStrategy(new CustomStrategyProvider())
.withDatabase(new Database()
.withName("org.jooq.meta.mysql.MySQLDatabase")
.withIncludes(".*")
.withExcludes("")
.withSchemata(new SchemaMappingType().withInputSchema("ormtester").withOutputSchema("ormtester"))
.withInputCatalog("ormtester")
.withOutputCatalog("ormtester"))
.withTarget(new Target()
.withPackageName("com.ormtester.jooq.domain")
.withDirectory("jooq/src/main/java"))));
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
}
}
}
RouteableDataSource 是一种扩展AbstractRoutingDataSource的类型,因为在这种情况下,我需要有可能在运行时更改数据源。这个东西在项目的其他区域运行良好(或者换句话说,使用 Hibernate 或 MyBatis 等工具)。
如您所见,有一个用于生成域类的@PostConstruct方法,问题是该方法不会生成任何错误或其他东西,但也不会生成类。我尝试使用 PostgreSQL 和 Oracle 数据库运行它(当然要更改驱动程序、数据库名称等),情况看起来完全一样。
一件有趣的事情是,当我运行此代码并且包com.ormtester.jooq.domain存在时 - 在方法执行期间,域包被删除。
我还想提一下,通过位于项目主(启动器)类中的@SpringBootApplication注释排除JooqAutoConfiguration类来禁用 JOOQ 自动配置。
IDE 正在管理员模式下运行 - 还有一点很有趣 - 如果我将在我提供的自定义命名策略中的getJavaClassName()方法中设置断点(CustomStrategyProvider扩展DefaultGeneratorStrategy类,则每次使用此方法时都会到达断点。
那么是否有人面临同样的问题和/或只是可以告诉我我做错了什么或我在这里提供的代码片段中缺少什么?我从大约 4 天开始就遇到了这个问题,现在我已经没有什么想法可能出问题了。我浏览了许多论坛上的大量主题,但没有任何帮助,包括作者页面上的教程(在我看来,这只是缺乏重要信息)。
我将非常感谢您的每一次帮助-在此先感谢!
解决方案
代码生成是构建任务,而不是运行时任务。我想不出只在运行时生成代码才有意义的合理场景。
问题是我正在尝试使用java代码方式生成域类(而不是使用带有自定义命名策略提供程序的maven的codegen插件)
您必须创建一个单独的 maven 模块(或项目),在其中构建自定义命名策略,然后将其作为依赖项添加到 jOOQ 代码生成插件。这与 的工作方式相同JPADatabase
,实体必须放置在单独的 maven 模块中。
推荐阅读
- android - 使用 Firebase 中的两组数据填充 RecyclerView
- r - 如何在给定字符串处分隔数据文件中的列?
- php - 数组中的 div 回显多次出现
- google-cloud-platform - 嵌入式实体和使用 GCP 数据存储上的祖先路径的实体之间的区别
- sql - 如何通过从 SQL 查询中删除分隔符来获取记录
- python - 使用关键字参数“{'pk': ''}' 未找到“plan_edit”的反向。尝试了 1 种模式:['palan/edit$']
- tensorflow - 为什么 AdamOptimizer 无法找到最小化 x*x 的最优值?
- android - 如何将材料组件库中的芯片添加到android中的输入字段?
- java - java.net.SocketException:连接重置-在tomcat中部署为webapps的客户端和服务器之间
- java - 在数组中查找重复项