我需要检查应用程序启动时当前在DB和架构中的DB架构是否与先前JOOQ生成的模型相同。 我尝试使用建议的解决方案here并发现了一些问题:
MY_SCHEMA.getTables().equals(create.meta().getTables())
:此处仅检查架构和名称,而不是列类型。我尝试使用create.meta().getTables()
中提供的信息并手动进行比较,但遇到了另一个问题。在某些情况下,运行时从create.meta()
检索的生成字段和字段的数据类型不匹配。
示例是"time" timestamp without time zone DEFAULT now()
字段,其中length
,precision
,scale
值并且在运行时JOOQ字段中没有defaultValue
值,但没有将它们放在生成的JOOQ字段中并改为defaultValue
。
JOOQ的行为是否正确?使用create.meta()
提取的元数据和生成的模式中的元数据不能用于比较。有没有其他方法可以正确地做到这一点?
使用测试:
带有JDBC 9.4.1208驱动程序的PostgreSQL 9.5.3,
JOOQ 3.8.2,
Java 8
答案 0 :(得分:0)
确实,(不幸的是)生成的代码(更完整)与org.jooq.Meta
提供的内容(不太完整)之间存在细微差别,因为后者内部依赖于JDBC {{1} },它并不总是正确/完全实现。
解决问题的一种方法是将生成的代码与jOOQ-meta的输出进行比较,jOOQ-meta是jOOQ代码生成器使用的库。这将是更多的手动编码工作,但从jOOQ 3.8开始,它与用例一样好。
另一种解决方法(更多的是黑客攻击)是将生成的Java代码与文件系统级别(如git diff)上的重新生成进行比较。我不确定这种方法是否适合你。