使用 JOOQ 从单个 table 生成多个 java 枚举
Generating multiple java Enums from a single table, using JOOQ
我的数据库架构中有一个 table,其中包含我正在构建的应用程序的配置信息。我想根据 table 的内容生成一些枚举。我目前在我的构建脚本中使用 JOOQ 从同一个数据库生成其他标准 JOOQ 类,我希望我可以通过 JOOQ 获得这个新功能。
例如,如果 table 包含以下数据
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 是包,枚举都称为组件。
精确的细节有待获取(例如,我可以接受不同的命名约定,因此欢迎提出任何建议),但主体(来自 table 的两个枚举,基于数据其中)是,至少对于这个问题,我需要的东西。
阅读了 JOOQ 文档后,我发现生成枚举曾经是 JOOQ 的一部分,然后被删除了。我在 JOOQ 中看不到 "obvious" 做我想做的事情的方法,但它是一个非常棒的库,所以我猜可能会有一个。
编辑
许多评论者质疑整体方法,我理解这一点。我想避免这种对话——我基本上不可能在这个论坛上讨论这种设计水平。这种方法(基于 DDL 和 SQL 的代码生成)在我的组织中经过了很好的测试,并且进行了大量的设计审查。
仅作记录,这里是管道的大纲。我把它放进去是因为我感谢人们花时间考虑我最初的问题,我想弄清楚这个问题如何适合我们的整个开发系统。
项目一包含一些引导 类、一些 DDL 和一些 SQL 脚本,其中包含我们整个系统使用的数据常量。它的输出包括(除其他外)一些 .jar 文件,其中包含生成的 类 的编译版本。这些基本上构成了我们系统的其余部分用来交流的核心商定词汇。
项目二拥有 java 源代码,它利用了项目一生成的各种工件。在项目二被编译之前,可以假设项目一的工件已经生成。因此,例如,从项目一中保存的数据生成的枚举可以在编译时用于项目二。
我们的构建脚本构建项目一,并使输出可用于项目二。这包括生成 Eclipse 项目文件,以便项目二的用户可以为项目的任何分支签出、构建和打开 Eclipse "just works"。
还有其他项目(包括不同语言的项目,例如 Javascript)也使用项目一生成的工件。
这种方法的主要好处是,当项目一中的数据发生变化时,项目一中的 类 和枚举的定义因此发生变化,项目二会通过编译时错误反映这种变化,而不是 运行 时间错误。这在实践中的好处绝对是巨大的。是的,存在设置成本,但根据我们的经验,JOOQ(我们用它来生成项目 1 的输出)等工具使我们的工作效率比以前高得多。
尤其是在我们发布桌面、浏览器内和 J2EE 组件并且它们都需要一起通信的情况下。
这不会是一个详尽的答案,因为这个问题有点自以为是,但我可以提供一些关于 jOOQ 中此功能历史的权威背景:
Having read the JOOQ docs, I see that generating Enums was once a part of JOOQ, and then removed.
是的,删除的原因恰恰是因为当时存在的实现还远远不够复杂,无法满足例如您的特定用例。
代码生成是一个非常临时的 "science" 并且很难向后兼容地维护配置 API ,它可以适应所有可能的用例......例如,事实上,您想将部分主数据映射到包中,class 名称不变,订购自定义是相当特殊的,而不是通用的。
此外,应该从哪里引用生成的枚举?原始实现在生成的代码中用枚举引用替换了外键(例如整数)。在某些情况下,这可能根本不是您想要的,您确实希望以原始形式加入主数据,而不是作为生成的枚举。
长话短说,这是 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 or Xtend and generate the code manually as part of your build. You could, in fact, even generate custom Converter
or Binding
实现之类的模板语言将您的枚举绑定到相关的引用列。
我的数据库架构中有一个 table,其中包含我正在构建的应用程序的配置信息。我想根据 table 的内容生成一些枚举。我目前在我的构建脚本中使用 JOOQ 从同一个数据库生成其他标准 JOOQ 类,我希望我可以通过 JOOQ 获得这个新功能。
例如,如果 table 包含以下数据
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 是包,枚举都称为组件。
精确的细节有待获取(例如,我可以接受不同的命名约定,因此欢迎提出任何建议),但主体(来自 table 的两个枚举,基于数据其中)是,至少对于这个问题,我需要的东西。
阅读了 JOOQ 文档后,我发现生成枚举曾经是 JOOQ 的一部分,然后被删除了。我在 JOOQ 中看不到 "obvious" 做我想做的事情的方法,但它是一个非常棒的库,所以我猜可能会有一个。
编辑
许多评论者质疑整体方法,我理解这一点。我想避免这种对话——我基本上不可能在这个论坛上讨论这种设计水平。这种方法(基于 DDL 和 SQL 的代码生成)在我的组织中经过了很好的测试,并且进行了大量的设计审查。
仅作记录,这里是管道的大纲。我把它放进去是因为我感谢人们花时间考虑我最初的问题,我想弄清楚这个问题如何适合我们的整个开发系统。
项目一包含一些引导 类、一些 DDL 和一些 SQL 脚本,其中包含我们整个系统使用的数据常量。它的输出包括(除其他外)一些 .jar 文件,其中包含生成的 类 的编译版本。这些基本上构成了我们系统的其余部分用来交流的核心商定词汇。
项目二拥有 java 源代码,它利用了项目一生成的各种工件。在项目二被编译之前,可以假设项目一的工件已经生成。因此,例如,从项目一中保存的数据生成的枚举可以在编译时用于项目二。
我们的构建脚本构建项目一,并使输出可用于项目二。这包括生成 Eclipse 项目文件,以便项目二的用户可以为项目的任何分支签出、构建和打开 Eclipse "just works"。
还有其他项目(包括不同语言的项目,例如 Javascript)也使用项目一生成的工件。
这种方法的主要好处是,当项目一中的数据发生变化时,项目一中的 类 和枚举的定义因此发生变化,项目二会通过编译时错误反映这种变化,而不是 运行 时间错误。这在实践中的好处绝对是巨大的。是的,存在设置成本,但根据我们的经验,JOOQ(我们用它来生成项目 1 的输出)等工具使我们的工作效率比以前高得多。
尤其是在我们发布桌面、浏览器内和 J2EE 组件并且它们都需要一起通信的情况下。
这不会是一个详尽的答案,因为这个问题有点自以为是,但我可以提供一些关于 jOOQ 中此功能历史的权威背景:
Having read the JOOQ docs, I see that generating Enums was once a part of JOOQ, and then removed.
是的,删除的原因恰恰是因为当时存在的实现还远远不够复杂,无法满足例如您的特定用例。
代码生成是一个非常临时的 "science" 并且很难向后兼容地维护配置 API ,它可以适应所有可能的用例......例如,事实上,您想将部分主数据映射到包中,class 名称不变,订购自定义是相当特殊的,而不是通用的。
此外,应该从哪里引用生成的枚举?原始实现在生成的代码中用枚举引用替换了外键(例如整数)。在某些情况下,这可能根本不是您想要的,您确实希望以原始形式加入主数据,而不是作为生成的枚举。
长话短说,这是 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 or Xtend and generate the code manually as part of your build. You could, in fact, even generate custom Converter
or Binding
实现之类的模板语言将您的枚举绑定到相关的引用列。