JPA Buddy指南

news2024/12/25 1:23:08

1. 概述

JPA Buddy是一个广泛使用的IntelliJ IDEA插件,面向使用JPA数据模型和相关技术(如Spring DataJPA,DB版本控制工具(Flyway,Liquibase),MapStruct等)的新手和有经验的开发人员。该插件提供了可视化设计器、代码生成和其他检查,这些检查应根据 JPA 的最佳实践简化开发并改进代码。

该插件在IntelliJ IDEA的社区和终极版本下工作,并使用“免费增值”模型。大多数功能都是免费提供的,我们需要购买订阅才能访问付费功能。

在本教程中,我们将介绍插件的主要功能,并了解如何在应用程序开发周期中使用它们。例如,我们将使用流行的参考应用程序 - “Spring PetClinic”。

2. 入门

我们可以在将 JPA 依赖项添加到应用程序源代码时自动激活 JPA 好友。该插件在“推荐的 InteiilJ 插件”列表中,因此即使我们没有安装它,IDEA 也会建议我们这样做。我们还可以从IntelliJ的市场安装插件:

 

JPA 好友功能可能因附加到应用程序的库而异。例如,如果我们既没有连接 Liquibase 也没有连接 Flyway,我们将看不到用于生成数据库版本控制脚本的菜单。

3. 与 JPA 实体合作

通常,应用程序开发从数据模型开始。JPA Buddy 提供了一个可视化设计器和组件面板,允许我们创建一个实体并向其添加基本属性和关联。我们可以从上下文菜单或 JPA 结构工具窗口调用相应的操作:

 

如果我们需要添加或编辑实体属性,可以使用 JPA 调色板和检查器。要添加属性,我们需要双击它或执行拖放。可视化编辑器允许我们定义属性属性:

 

要编辑实体的属性,我们可以使用 JPA 检查器。根据 JPA 规范,检查器允许我们查看和编辑实体属性的几乎所有选项。编辑器是双向工作的:当我们更新属性的属性时,代码也会更新。反之亦然,当实体的代码更新时,所有更改都会反映在检查器中。

3.1. 龙目岛支持

根据 JPA 规范,实体应该具有属性的 getter 和 setter,这通常被视为“样板”代码。龙目岛是一个流行的库,它允许我们避免编写样板并将其替换为几个注释。许多开发人员在 JPA 实体定义中使用 Lombok,因此 JPA Buddy 完全支持它。我们可以在 JPA 检查器中编辑与龙目岛相关的属性:

 

插件功能不仅限于检查和编辑。支持的重要部分是检查。某些龙目岛注释在与 JPA 一起使用时可能会导致性能问题或意外错误。例如,使用@ToString注可能会导致LazyInitException,因为它使用对象字符串表示形式的所有属性,包括惰性属性。

JPA Buddy 显示针对此类情况的警告并提供快速修复,它帮助我们避免 JPA 代码中的错误:

 

4.DB Liquibase和Flyway的迁移

要从 JPA 数据模型创建数据库,我们通常使用数据库版本控制工具;Liquibase和Flyway是该领域的两个重要参与者。数据库迁移过程中最容易出错的部分是根据 JPA 实体的更改编写迁移脚本。JPA Buddy为Liquibase和Flyway提供了模式差异脚本生成。该插件可以将现有数据库模式与 JPA 模型甚至两个模式进行比较:

 

除此之外,JPA Buddy 还提供脚本自动完成和智能预览。在此模式下,插件会分析生成的脚本,如果更改可能导致目标数据源在更新时失败,则会显示警告:

 

5. 弹簧数据JPA支持

创建数据模型后,下一步是实现数据访问存储库。Spring Data JPA可能是最流行的框架。JPA Buddy 允许我们根据实体定义生成新的存储库。在存储库代码中,我们可以使用 JPA 调色板使用可视化工具在存储库代码中创建各种派生方法和查询:

 

对于每种方法,我们都可以使用 JPA 检查器更改其属性。该插件允许我们添加分页和排序,并为方法的返回数据类型创建投影:

 

一个更有用的功能是查询提取。有时,派生方法名称对于像这样复杂的查询来说可能会变得太长:

List<Owner> findDistinctByFirstNameIgnoreCaseOrLastNameIgnoreCaseOrPets_NameIgnoreCaseAllIgnoreCaseOrderByFirstNameAsc(
  String firstName, String lastName, String name);

JPA Buddy 分析派生的方法名称,并允许我们通过重命名 JPQL 查询并将其移动到@Query注释来重构它:

 

@Query("select distinct o from Owner o left join o.pets pets " +
  "where upper(o.firstName) = upper(:firstName) " +
  "or upper(o.lastName) = upper(:lastName) " +
  "or upper(pets.name) = upper(:name) " +
  "order by o.firstName")
List<Owner> findByAnyName(@Param("firstName") String firstName,
  @Param("lastName") String lastName,
  @Param("name") String name);

6. 基于数据库表的实体生成

数据通常比代码更长久,因此当我们在现有数据库上构建 JPA 数据层时,我们需要基于当前表创建 JPA 实体。JPA Buddy 提供了此功能,并允许开发人员以“挑选”的方式创建实体,逐个选择表:

 

与现有解决方案相比,该插件执行“智能”生成并尝试检测实体之间的关联。即使对于没有列支持的OneToMany和ManyToMore实体,我们也将生成相应的属性:

 

JPA Buddy 生成“空”实体,其中只有一个 ID 列,正文中有一个 TODO 注释,用于此类关联。通过单击此 TODO,我们可以为现有实体运行列导入过程:

 

7. DTO 和映射器生成

DTO是一种有价值的设计模式,用于传递我们无法直接映射到JPA实体的数据的情况。例如,在创建 REST API 时,我们可能只想公开一些实体属性。

JPA Buddy可以使用MapStruct库生成DTO和映射器。我们需要做的就是为生成的 DTO 选择所需的属性:

 

该插件生成 DTO 和映射器,包括关联的正确映射。JPA Buddy在这种情况下也支持龙目岛,并为DTO生成适当的注释:

@Data
public class OwnerDto implements Serializable {
   private final Integer id;
   @NotEmpty
   private final String firstName;
   @NotEmpty
   private final String lastName;
   private final List<PetDto> pets;
}

8. 简约模式

JPA Buddy有一个友好的UI,但对于那些喜欢IntelliJ IDEA中“集中”视图的人来说,该插件提供了“简约模式”。我们可以隐藏所有工具窗口,并且仅将键盘用于实体生成、Spring Data JPA 存储库创建和编辑、调用 DTO 创建向导等:

 

9. 结论

JPA Buddy 提供了一组强大的工具,使 JPA 开发更容易。该插件的好处是它不仅支持JPA,还支持数据访问层开发中使用的相关库:Spring Data JPA,MapStruct,Lombok和DB版本控制解决方案。

如果我们考虑 IntelliJ IDEA 社区,这个插件可以显着简化 JPA 的工作。IDEA Ultimate用户可以从捆绑的插件中获得一些JPA Buddy功能,以获得JPA和Spring框架支持。尽管如此,看起来数据库版本控制脚本生成和 DTO 创建功能在数据库开发自动化中仍然是独一无二的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

猿创征文|C++软件开发值得推荐的十大高效软件分析工具

目录 1、概述 2、高效软件工具介绍 2.1、窗口查看工具SPY 2.2、Dependency Walker 2.3、剪切板查看工具Clipbrd 2.4、GDI对象查看工具GDIView 2.5、Process Explorer 2.6、Prcoess Monitor 2.7、API Monitor 2.8、调试器Windbg 2.9、反汇编工具IDA 2.10、抓包工具…

【毕业设计】深度学习试卷批改系统 - opencv python 机器视觉

文章目录0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现6 算法测试7 系统实现8 最后0 简介…

使用react开发谷歌插件

前言 自己搭架子确实不会&#xff0c;好在github上有已经搭好的架子&#xff0c;具体见&#xff1a;https://github.com/satendra02/react-chrome-extension 项目是基于react16和scss的还是挺不错的。 不过这个是基于v2版本的&#xff0c;现在已经是v3版本了&#xff0c;我们…

【面试题】近期学员被问最多的真实面试题记录(如何分配测试任务?)

问题均由朋友/粉丝提供的真实面试记录&#xff0c;帮大家解答&#xff0c;我义不容辞&#xff0c;但有些问题如果回答的不够仔细和正确&#xff0c;也希望大家能客观的指出改正&#xff0c;轻喷。 问题&#xff1a;发现了线上bug&#xff0c;作为测试&#xff0c;你是如何发挥…

net基于asp.net的二手商品的交易系统-二手网站-计算机毕业设计

项目介绍 基于ASP.NET的二手商品的交易系统是针对目前二手商品交易的实际需求,从实际工作出发,对过去的二手商品交易平台存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计…

GitHub神坛变动,10W字Spring Cloud Alibaba笔记,30W星标登顶第一

Spring Cloud Alibaba是Spring Cloud下的一个子项目&#xff0c;使用 Spring Cloud Alibaba&#xff0c;只需添加一些注解和少量配置&#xff0c;即可将 Spring Cloud 应用连接到 Alibaba 的分布式解决方案中&#xff0c;并使用 Alibaba 中间件构建分布式应用系统。 ​为了帮助…

高手PM控制项目范围的流程和方法!

​项目的范围、成本与质量相互制约。 如果不能使用合理的手段和方法确定项目范围&#xff0c;不能在项目过程中有效的控制范围&#xff0c;不能让项目范围在各相关方之间达成一致&#xff0c;那么会对项目造成严重的伤害。 如无情消耗项目资源&#xff0c;影响范围内工作的有…

手机怎么把照片转JPG格式?这三种手机小技巧需要知道

怎么用手机把照片的格式转换成JPG格式呢&#xff1f;大家在日常中使用的照片&#xff0c;有的格式可能连自己都不清楚&#xff0c;只有在特定格式的情况下才会才会发现自己的图片格式需要转换才行&#xff0c;最常使用到的就是将照片转换成JPG格式了&#xff0c;那么我们怎么用…

最新解决谷歌翻译无法使用的教程

谷歌翻译无法使用是谷歌官方关闭了中国地区翻译服务。 废话不多说直接上教程&#xff0c;本质就是通过修改hosts文件让translate.googleapis.com域名的IP解析到国内的谷歌服务器IP&#xff0c;网上大部分的教程也是如此。 但是有个问题就是这个IP不稳定可能用了几天就不用了&am…

web前端期末大作业:青岛旅游网页主题网站设计——青岛民俗4页 HTML+CSS 民俗网页设计与制作 web网页设计实例作业 html实训大作业

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

有哪些编辑图片加文字的软件?这些软件值得收藏

大家平时在分享自己拍的照片的时候&#xff0c;会不会觉得照片有点单调&#xff0c;有些空旷呢&#xff1f;其实这时候&#xff0c;我们只需要对图片添加上一些文字描述&#xff0c;就可以大大提高图片的趣味性以及丰富图片的内容&#xff0c;并且我们也可以将这些加文字的图片…

LDO的前世今生

众所周知&#xff0c;开关电源的效率很高&#xff0c;但是输出电压有纹波&#xff0c;噪声很大&#xff0c;不能直接接入单片机控制电路中&#xff0c;而一般选择的方案都是在开关电源的输出端接一级LDO低压差线性稳压电源&#xff0c;可以保证输出到单片机中的电压很稳定&…

C语言知识之字符串

字符串 Problem Description 给你一个长度为l&#xff08;l<150&#xff09;的字符串&#xff0c;字符串包含很多个单词&#xff0c;每2个单词之间用一个或多个空格隔开&#xff0c; 单词内可能包含"?",例如单词"china"可能在字符串中表示为"c?h…

AIGC困局与Web3破圈之道

最近一年&#xff0c;随着 AIGC&#xff08;AI-Generated Content&#xff09; 技术的发展壮大&#xff0c;越来越多的人感受到了它的恐怖之处。AI 降低了创作门槛&#xff0c;使每个普通人都有机会展现自己的创造力&#xff0c;做出不输专业水平的作品。但是就在全民 AI 作图的…

JavaEE——Tomcat和servlet

Tomcat tomcat是一个http的服务器&#xff0c;用来简化我们的网站开发 大家在下载的时候&#xff0c;如果jdk是8&#xff0c;那么tomcat也应该大版本是8 安装解压缩后&#xff0c;可以看到其中的一系列目录 bin 是tomcat的启动脚本&#xff08;start.bat是windows用的&#x…

分布式IO系统应用连接华为云

分布式IO系统华为云设置 启用设置 &#xff1a;勾选启用 认证方式 &#xff1a;可选择设备秘钥方式和认证证书方式&#xff0c;认证证书方式需要上传证书 设备 ID &#xff1a;华为云创建设备时生成的设备 ID 服务 ID &#xff1a;产品需要创建服务才能上报数据 地域(Region …

Fiddler Classic 替换本地JS并远程调试

背景 众所周知&#xff0c;下载的m3u8文件无法直接播放&#xff0c;一般来讲m3u8文件采用AES128对称加密&#xff0c;并提供key、iv、ts列表。当然文件中的key与iv均为加密后的结果&#xff0c;需配合相应的解密文件与偏移量。本文基于某利威的player.js介绍如何利用Fiddler进…

Cesium案列学习(Multi-partCZML.html)

在学习这个案例之前&#xff0c;先花一点时间了解一下什么是CZML CZML Structure AnalyticalGraphicsInc/czml-writer Wiki (github.com) Cesium Language (CZML) 入门1 — CZML Structure&#xff08;CZML的结构&#xff09; - laixiangran - 博客园 CZML是JSON得一个子集…

面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然回答不上来...

一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么&#xff0c;大多数回答都是说请求响应之后 DOM 怎么被构建&#xff0c;被绘制出来。但是你有没有想过&#xff0c;收到的 HTML 如果包含几十个图片标签&#xff0c;这些图片是以什么方式、什么顺序、建…

什么是 Element NFT 市场和 NFT 聚合?

Oct. 2022, Vincy Data Source: Footprint Analytics - Element NFT Marketplace NFT 交易市场 Element 在 2021 年 7 月 1 日作为解决了大多数 DeFi 项目利息的波动问题以及用户存款后本金流动性的问题推出。 8 月 15 日&#xff0c;该平台正式推出 2.0 版本&#xff0c;与原…