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

jOOQ生成的类和实际DB模式的运行时验证

谷梁云瀚
2023-03-14

我需要在应用程序启动时检查当前在数据库中的数据库模式和以前用于JOOQ生成模型的模式是相同的。我试图使用这里建议的解决方案,发现了一些问题:

  1. 查询所有表的技巧:这种解决方案不检查列类型,只检查表名和字段名,但我也需要检查类型
  2. myu模式。getTables()。等于(create.meta()。getTables()):此处仅检查架构和名称,不再检查列类型

我试图使用create.meta(). getTables()中可用的信息并手动进行比较,但遇到了另一个问题。在某些情况下,生成字段的数据类型和运行时从create.meta()检索的字段不匹配。

例如,无时区默认值的“time”timestamp now()字段具有长度精度比例值,在运行时JOOQ字段中没有默认值值,但在生成的JOOQ字段中没有,而是具有默认值

这是JOOQ的正确行为吗?使用create提取元数据。meta()和生成的架构中的元数据不能按原样用于比较。有没有其他正确的方法?

对于使用的测试:
PostgreSQL 9.5.3与JDBC 9.4.1208驱动程序,
JOOQ 3.8.2,
Java8

共有1个答案

岳池暝
2023-03-14

事实上,(不幸的是)在生成的代码(更完整的代码)和org交付的代码之间存在着细微的差异。约克。Meta(不太完整),因为后者在内部依赖于JDBC的DatabaseMetaData,后者并不总是正确/完整地实现。

解决问题的一种方法是将生成的代码与jOOQ meta(jOOQ代码生成器使用的库)的输出进行比较。这将是更多的手工编码工作,但对于您的用例来说,这与JOOQ3.8一样好。

另一个变通方法(更像是黑客)是将生成的Java代码与文件系统级别上的新重新生成进行比较(如git diff)。我不确定这种方法是否对你有用。

 类似资料:
  • 我在构建过程中使用org.jooq.util.DefaultGenerator来生成jOOQ类来表示我的数据库模式。 当应用程序运行时,模式可能会在应用程序不知道的情况下更改。此类更改可能与已生成的代码兼容,也可能与已生成的代码不兼容。 如何在运行时检测生成的代码是否对特定模式仍然有效? 我正在寻找类似于布尔值stillValid=new SchemaValidator(存在的GeneratedC

  • 问题内容: 我在构建过程中使用来生成jOOQ类来表示我的数据库模式。 当应用程序运行时,架构可能会在应用程序不知道的情况下发生更改。这样的更改可能与已经生成的代码兼容,也可能与之不兼容。 如何在运行时中检测生成的代码是否仍然在特定模式下有效? 我正在寻找类似的东西 问题答案: 使用org.jooq.Meta的jOOQ 3.0解决方案 在即将到来的jOOQ 3.0中,可以通过新对象(通过功能请求#1

  • 问题内容: 我只是想听听Hibernate专家对基于Hibernate / JPA的项目的数据库模式生成最佳实践的看法。特别: 项目刚开始时要使用什么策略?是否建议让Hibernate在此阶段自动生成模式,还是从项目的最早阶段手动创建数据库表更好? 假装在整个项目中都是使用Hibernate生成架构的,那么在系统发布到生产环境之前,最好禁用自动架构的生成并手动创建数据库架构吗? 在系统投入生产后,

  • 我有一个由Quarkus添加到构建时初始化的第三方类,但由于静态线程使用,它需要运行时初始化。将其添加到运行时初始化本机构建时,会抱怨它同时存在于这两个版本中。 重新生成此文件的示例项目:https://github.com/hshorter/quarkus-avro-decode-example 使用“--initialize-at-run-time=org.apache.avro.specif

  • Dave使用Flyway为Alice和Bob初始化模式,因此他们都有foo table和bar函数。Dave使用jOOQ生成java api,并在运行时将开发模式映射到用户模式。戴夫以前和他的任何一个客户都没有关系,突然发现自己是鲍勃的侄子。 但是爱丽丝和鲍勃后来都回来找戴夫,让他为他们写一些自动化。因此,Dave决定创建一个机器用户Rob,他可以访问Alice和Bob的模式。他可以重用所有相同的

  • Jooq不生成类。我使用gradle插件https://github.com/etiennestuder/gradle-jooq-plugin使用postgresql 42.2.24。我的问题是什么?这是我的身材 输出任务:生成Jooq 在2s中成功构建1个可操作任务:1个已执行