java - 使用 JOOQ 从单个表生成多个 java 枚举

标签 java jooq

我的数据库架构中有一个表,其中包含我正在构建的应用程序的配置信息。我想根据表的内容生成一些枚举。我目前在我的构建脚本中使用 JOOQ 从同一个数据库生成其他标准 JOOQ 类,我希望我可以通过 JOOQ 获得这个新功能。

例如,如果表中包含以下数据

Product        Component    PresentationOrder
HydroProduct   Boat         1
HydroProduct   Canoe        2
HyrdoProduct   Ship         3
LandProduct    Car          1
LandProduct    Bike         2

然后我想生成两个枚举

hydroProduct.Components { Boat, Canoe, Ship; }

landProduct.Components {Car, Bike; }

其中 hydroProduct 和 landProduct 是包,枚举都称为组件。

确切的细节有待掌握(例如,我可以接受不同的命名约定,因此欢迎提出任何建议),但主体(一个表中的两个枚举,基于其中的数据)至少是对于这个问题,我需要的东西。

阅读 JOOQ 文档后,我发现生成枚举曾经是 JOOQ 的一部分,然后被删除了。我看不到在 JOOQ 中做我想做的事情的“明显”方式,但它是一个非常棒的库,所以我猜可能会有一个。

编辑

许多评论者质疑整体方法,我理解这一点。我想避免这种对话——我基本上不可能在这个论坛上讨论这种设计水平。这种方法(基于 DDL 和 SQL 的代码生成)在我的组织内经过了很好的测试,并且进行了大量的设计审查。

仅作记录,这里是管道的大纲。我把它放进去是因为我感谢人们花时间考虑我最初的问题,我想弄清楚这个问题如何适合我们的整个开发系统。

Project One 包含一些引导类、一些 DDL 和一些包含我们整个系统使用的数据常量的 SQL 脚本。它的输出包括(除其他外)一些 .jar 文件,其中包含生成的类的编译版本。这些基本上构成了我们系统的其余部分用于交流的核心商定词汇。

项目二拥有 java 源代码,它利用了项目一生成的各种工件。在项目二被编译之前,可以假设项目一的工件已经生成。因此,例如,从项目一中保存的数据生成的枚举可以在编译时用于项目二。

我们的构建脚本构建项目一,并使输出可用于项目二。这包括生成 Eclipse 项目文件,以便项目二的用户可以为项目的任何分支 check out 、构建和打开 Eclipse,并且它“正常工作”。

还有其他项目(包括使用不同语言的项目,例如 Javascript)也使用项目一生成的工件。

这种方法的主要好处是,当项目一中的数据发生变化,并且项目一中的类和枚举的定义因此发生变化时,项目二会通过编译时错误而不是运行时错误来反射(reflect)这种变化.这在实践中的好处绝对是巨大的。是的,存在设置成本,但根据我们的经验,JOOQ(我们使用它来生成项目 1 的输出)等工具使我们的工作效率比过去高得多。

尤其是在我们发布桌面、浏览器内和 J2EE 组件并且它们都需要一起通信的情况下。

最佳答案

这不会是一个详尽的答案,因为这个问题有点自以为是,但我可以提供一些关于 jOOQ 中此功能历史的权威背景:

Having read the JOOQ docs, I see that generating Enums was once a part of JOOQ, and then removed.

是的,删除的原因恰恰是因为当时存在的实现还远远不够复杂,无法满足例如您的特定用例。

代码生成是一门非常特殊的“科学”,很难向后兼容地维护一个配置 API,它可以适应所有可能的用例……例如,您想要映射零件将您的主数据打包到包中,类名是不变的,订购自定义是相当特殊的,而不是通用的。

此外,应该从哪里引用生成的枚举?原始实现在生成的代码中用枚举引用替换了外键(例如整数)。在某些情况下,这可能根本不是您想要的,您确实希望以原始形式加入主数据,而不是作为生成的枚举。

长话短说,这是 jOOQ 1.x 中急切添加的功能,在创建 jOOQ 3.x 所需的主要内部重构期间极难维护,which is why it was dropped .

I can't see the "obvious" way of doing what I want in JOOQ, but it's a pretty amazing library, so I'm guessing that there might be one.

不是开箱即用的。我建议使用像 Velocity 这样的模板语言或 Xtend并在构建过程中手动生成代码。事实上,您甚至可以生成自定义 Converter or Binding将您的枚举绑定(bind)到相关引用列的实现。

关于java - 使用 JOOQ 从单个表生成多个 java 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31395905/

相关文章:

java - Jooq:批量插入多条记录

sql - jOOQ - CTE 和 INSERT

mysql - BoneCP批量插入MySQL时抛出 "SQLException: Connection is closed!"

java - 使用 JDBC 连接 SQL Server 2008 R2 时出错

java - JPA 中日期到日期时间的转换

arrays - 尝试在 kotlin 中使用 jooq any 运算符时出现编译错误

Java 泛型和 jOOQ - 如何创建一个 jOOQ 列到另一列的 HashMap

基于java的编程挑战

java - 为什么 ConfigurationProperties 类中的嵌套类需要是静态的?

java - 在 Android 中制作时间表的最佳方式?