JPA的好友变得更加轻松


因此,Hello World ...经过近一年的开发,JPA Buddy的第一个版本终于发布了!这是一个免费工具,应该成为您使用JPA和所有相关项目的忠实编码助手:Hibernate,Spring Data,Liquibase和其他主流堆栈。

“我为什么要使用它?” -对于任何新工具或框架,这都是一个公平的问题。简而言之,如果您使用JPA进行数据持久化,那么JPA Buddy将帮助您提高效率。在本文中,我将对该工具进行概述。我希望它在Java开发人员最喜欢的工具,使用JPA,Spring,Liquibase以及当然是最高级的Java IDE-IntelliJ IDEA的工具中占有一席之地。

背后的故事

我们是CUBA平台的创建者(顺便说一下,几周前它已重命名为Jmix :))-一种基于Java的快速应用程序开发环境。CUBA平台是一个非常独特的产品。它包含两个部分:框架和开发工具。CUBA Studio(用于CUBA的专用IDE)最受喜爱的部分之一是“实体设计器”,它使CUBA社区的2万多名成员惊讶于任何人都能轻松快捷地设计其数据模型。即使对于从未听说过JPA的用户,诸如创建JPA实体,约束,DDL脚本之类的事情也变得轻而易举。

自2016年以来,当CUBA开源时,我们参加了全球数十个会议,收集反馈并更好地了解开发人员的需求。最烦人的问题之一是-“我们可以在没有CUBA的情况下在您的应用程序中使用您的实体设计器吗?”。我很高兴地宣布,通过JPA Buddy,我们成功地将否定答案改为...是的!

JPA Buddy是非侵入性的,不需要任何额外的依赖关系-它是一个工具,而且只是一个工具。这意味着您不仅可以从使用JPA作为持久层的新项目中受益,而且还可以从已有项目中受益。它是IntelliJ IDEA的补充,可启用许多与JPA相关的功能。JPA Buddy可帮助您生成代码,查找和修复潜在的错误,重构并执行其他费力的样板操作。

范围

在JPA Buddy获得其第一行代码之前,我们进行了一次调查,以收集JPA和周围技术的各种用例。结果看起来不是很奇怪-平均应用时下正春启动的应用程序与休眠作为一个ORM实现,春天JPA的数据作为数据处理机制和迁飞或Liquibase数据库迁移系统。嗯,几乎忘了Lombok了。此技术堆栈成为我们第一个版本的主要关注点。

在谈到工具的目标时,我们追求以下目标:

  • 最小化手动样板代码-该工具应生成可以手动但更快地编写的代码
  • 节省阅读文档的时间-该工具必须为直观的视觉设计师提供直观的解释
  • 留出选择的自由-该工具不得规定任何特定的编码样式,而应提供各种选择
  • 检测潜在问题并提供解决最常见问题的方法-该工具应尽早(最好在编码阶段,而不是在运行时)警告* 开发人员有关此类问题的信息
  • 提供有关项目的以数据为中心的视图,并在相关对象之间方便地导航

对于第一个版本,我们能够提供涵盖数据模型开发大多数方面的相当多的功能。对于使用Liquibase的人来说是个好消息-它已在JPA Buddy的第一个版本中实现并可用。对于Flyway用户而言,这不是一个好消息-它位于功能的高优先级列表中。

在长期计划中,我们将介绍以下功能:

  • 特定于Hibernate的注释,例如@Where, @NaturalId, @Formula,Hibernate搜索注释和其他注释...
  • 视觉查询设计器
  • 使用Envers和Spring Data JPA进行审核
  • 数据库模式的逆向工程
  • 支持Kotlin

在第二阶段,我们还需要牢记一些功能:Quarkus和Micronaut支持,REST API和CRUD操作的UI生成。

正如你可以看到,前面还有很长的路要走,我们将非常感激您对优先上述所有功能的帮助-不要犹豫,让我们知道您的观点通过我们的联系表格,微博或加入不和谐聊天。

概述

让我简要概述一下它的外观。自安装JPA Buddy以来,您将找到3个其他工具窗口:JPA Structure,JPA Palette和JPA Inspector。

image13_1cb6440aa3.png

JPA结构

JPA Structure始终在左下角可用。它提供了一个以数据为中心的综合项目视图。您可以将其用于许多不同的目的:

  1. 遍历数据模型。实体结构以分层方式表示。您可以轻松观察并导航到引用当前实体的实体以及当前实体所引用的实体。这是一个非常有用的功能,特别是对于那些刚刚进入具有大型实体图的现有项目的人或对于代码审阅者而言,他们经常是第一次看到数据模型的某些部分,并且在有限的时间内了解其设计方式。
  2. 创建与数据相关的对象:实体,JPA转换器/ Hibernate类型,Spring Data存储库和Liquibase更改日志。
  3. 观察每个实体的相关Spring Data存储库。
  4. 查看Liquibase变更日志及其内部结构,以便于导航。
  5. 指定插件无法自动检测到的与插件相关的设置,例如数据库连接,持久性单元等。

image8_6b93c45c12.png

更多功能即将推出...

JPA调色板和检查器

JPA Palette位于右上方,其内容取决于上下文。仅当Buddy准备提供某些东西来快速生成代码时,它才可用。当前,该工具在编辑以下对象时出现:JPA实体,Spring Data存储库和Liquibase changelog。只需从列表中找到所需的选项,然后双击它即可!

JPA Inspector放置在面板下方的右下角,并且与它同步地变得可见和不可见。检查器还取决于上下文。“组件面板”为您提供了许多用于生成新代码部分的选项,而“检查器”旨在修改已经存在的代码。在这里,您可以看到调整代码的选定部分所必须具备的功能,例如,实体字段或Liquibase变更集的语句。

image9_1471956ca0.png image5_7dbbb68602.png

这些功能对于新手和有经验的用户都非常有用。青少年可以使用直观的可视设计器评估选项的完整列表,选择合适的选项并生成有效的代码。老年人经常会忘记一些日常不常用的小东西,而Buddy会在搜索文档时节省宝贵的时间,以便记住正确的注释或语法。

image10_b619f84ecf.png image2_f6b0adbd3f.png image3_6ae8399e99.png

Liquibase集成

对于那些使用Liquibase作为数据库架构版本控制解决方案的人来说是个好消息。JPA Buddy与它紧密集成,从而实现了方便的变更日志编辑,智能的变更日志生成和灵活的类型管理。

首先,您将获得一个可视化的设计师来编辑变更日志。在“选用板”中浏览各种可用命令,然后使用“检查器”工具窗口查看可以应用于所选语句的不同设置。

其次,您可以定义自己的映射以匹配Java类型(转换器/休眠类型)以及每个特定DBMS应该使用的映射。当这个功能非常有用时,让我举几个例子:

  • 使用字节数组实体字段,Hibernate方案生成器以及Liquibase会将您的Byte []映射到一个非常奇特的OID类型。我想很多开发人员更愿意使用bytea而不是默认的建议类型。通过将bytea指定为byte []的所需映射类型,可以轻松解决此问题。
  • 使用JPA转换器或Hibernate自定义类型会在Hibernate方案生成器和Liquibase changelog生成器中导致无法预料的行为甚至失败。您可以在JPA Buddy中定义正确的类型来解决此问题。
  • 使用String字段,我们可能希望将其映射到nvarchar而不是默认的varchar。

image4_73efdc8a1e.png

传统上,可以使用columnDefinition属性解决所有这些情况,但是,此解决方案不适用于跨DBMS解决方案。

最后,最省时的功能:Liquibase changelogs生成器。根据我的经验(由前面提到的调查证明),有两种主要的创建Liquibase变更日志的方法:

  • 手动编写变更日志。
  • 通过比较两个数据库(源数据库(代表模型的实际状态))与目标数据库(具有模型的先前状态)来生成脚本。 对于那些喜欢第一种选择的人,JPA Buddy支持已经提到的变更日志设计器。

第二种选择似乎是最常用的一种。因此,我们比较两个数据库。目标数据库相对容易获得,例如,我们可以简单地创建生产环境的转储。问题与源数据库有关。让我们从一个小问题开始:开发人员的便携式计算机上用于开发的数据库可能与生产数据库的DBMS类型不同。嗯,这可以通过例如在Mac上的Docker中运行MS SQL来解决。更严重的是,很难找到“干净的”源数据库,因为它通常是在Hibernate模式生成器进行开发时形成的。通常,这会导致一堆垃圾表和属性,这些垃圾表和属性最终会出现在生产数据库中。

JPA Buddy提供了令人赞叹的功能,可以通过将JPA实体与目标数据库(或目标数据库的快照)进行比较来直接生成变更日志。您可以出于开发目的运行H2,但仍可以为Oracle或MS SQL或您在生产中使用的任何内容提供正确的变更日志。这样可以确保,如果您的变更日志中有垃圾,那么这就是源代码中的垃圾。您需要做的只是保持数据模型的清洁,并确保迁移不会给生产数据库带来不必要的影响。

image11_c3a89728fc.png

changelogs生成器的另一个功能是能够将结果语句过滤为3类:

  • 仅包含安全语句,在更新或破坏应用程序时不会失败的语句,例如添加新列
  • 包含可能在更新时失败但不会导致数据丢失(例如,应用唯一约束)的语句
  • 包含会导致数据丢失的语句,例如删除表或列

image7_b854a71c62.png

您决定如何拆分此类语句:将它们放入单独的变更日志中,或仅使用某些标签或上下文对其进行标记。

结论

本文概述了JPA Buddy的第一个发行版。显然,与任何全新产品一样,它无法避免某些问题和缺陷。如今,主要重点是完善现有功能,检测和实现我们错过的基本功能。直接说来,我们想激发您成为早期采用者并形成最初的爱好者社区。安装JPA Buddy,尝试一下并与开发团队分享您的反馈-这将有助于将产品推向正确的方向!


原文链接:http://codingdict.com