1. 概要

JPA Buddy は、JPAデータモデルおよびSpring Data JPA 、DBバージョニングツール( Flyway Liquibase )、 MapStruct 、その他。 プラグインは、ビジュアルデザイナー、コード生成、およびJPAのベストプラクティスに従って開発を簡素化し、コードを改善する追加の検査を提供します。

プラグインは、IntelliJ IDEAのコミュニティバージョンとUltimateバージョンの両方で動作し、「フリーミアム」モデルを使用します。 ほとんどの機能は無料で利用できます。有料の機能にアクセスするには、サブスクリプションを購入する必要があります。

このチュートリアルでは、プラグインの主な機能を確認し、アプリケーション開発サイクル中にそれらをどのように使用できるかを確認します。 例として、人気のあるリファレンスアプリケーション「 SpringPetClinic」を使用します。

2. 入門

アプリケーションのソースコードにJPA依存関係を追加すると、JPAバディを自動的にアクティブ化できます。 プラグインは「推奨InteiilJプラグイン」リストに含まれているため、インストールされていない場合でも、IDEAはこれを行うことを提案します。 IntelliJのマーケットプレイスからプラグインをインストールすることもできます。

JPAバディの機能は、アプリケーションに接続されているライブラリによって異なる場合があります。 たとえば、LiquibaseもFlywayも接続されていない場合、DBバージョン管理スクリプト生成のメニューは表示されません。

3. JPAエンティティとの連携

通常、アプリケーション開発はデータモデルから始まります。 JPA Buddyは、エンティティーを作成し、それに基本的な属性と関連付けを追加できるビジュアル・デザイナーとコンポーネント・パレットを提供します。 コンテキストメニューまたはJPA構造ツールウィンドウから対応するアクションを呼び出すことができます。

エンティティ属性を追加または編集する必要がある場合は、JPAパレットとインスペクターを使用できます。 属性を追加するには、属性をダブルクリックするか、ドラッグアンドドロップを実行する必要があります。 ビジュアルエディタを使用すると、属性のプロパティを定義できます。

エンティティの属性を編集するには、JPAインスペクターを使用できます。 JPAの仕様によると、インスペクターを使用すると、エンティティの属性のほぼすべてのオプションを表示および編集できます。 エディターは両方の方法で機能します。属性のプロパティを更新すると、コードが更新されます。 逆に、エンティティのコードが更新されると、すべての変更がインスペクターに反映されます。

3.1. ロンボクサポート

JPA仕様によると、エンティティには属性のゲッターとセッターが必要であり、これは「ボイラープレート」コードとして扱われることがよくあります。 Lombok は人気のあるライブラリであり、定型文の記述を避け、いくつかの注釈に置き換えることができます。 多くの開発者はJPAエンティティ定義でLombokを使用しているため、JPABuddyはそれを完全にサポートしています。 JPAインスペクターでLombok関連のプロパティを編集できます。

プラグインの機能は、検査と編集に限定されません。 サポートの重要な部分は検査です。 一部のLombokアノテーションは、JPAで使用すると、パフォーマンスの問題や予期しないエラーを引き起こす可能性があります。 たとえば、 @ToString アノテーションを使用すると、レイジー属性を含むオブジェクト文字列表現のすべての属性が使用されるため、LazyInitExceptionが発生する可能性があります。

JPAバディは、このような場合の警告を表示し、迅速な修正を提供し、JPAコードのバグを回避するのに役立ちます。

4. LiquibaseとFlywayを使用したDB移行

JPAデータモデルからデータベースを作成するには、通常、DBバージョニングツールを使用します。 LiquibaseとFlywayは、この分野の2つの大きなプレーヤーです。 DB移行プロセスで最もエラーが発生しやすい部分は、JPAエンティティの変更に基づいて移行スクリプトを作成することです。 JPA Buddyは、LiquibaseとFlywayの両方にスキーマ差分スクリプト生成を提供します。 プラグインは、既存のDBスキーマをJPAモデルまたは2つのスキーマと比較できます。

これに加えて、JPAバディはスクリプトのオートコンプリートとスマートプレビューを提供します。 このモードでは、プラグインは生成されたスクリプトを分析し、変更によって更新時にターゲットデータソースで障害が発生する可能性がある場合は警告を表示します。

5. SpringDataJPAサポート

データモデルが作成されたら、次のステップはデータアクセスリポジトリの実装です。 Spring Data JPAは、おそらくこのための最も一般的なフレームワークです。 JPAバディを使用すると、エンティティ定義に基づいて新しいリポジトリを生成できます。 リポジトリコードでは、JPAパレットを使用して、ビジュアルツールを使用してリポジトリコードにさまざまな派生メソッドとクエリを作成できます。

メソッドごとに、JPAインスペクターを使用してそのプロパティを変更できます。 プラグインを使用すると、ページ付けと順序付けを追加したり、メソッドの戻りデータ型のプロジェクションを作成したりできます。

もう1つの便利な機能は、クエリ抽出です。 派生メソッド名は、次のような複雑なクエリでは長すぎる場合があります。

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

JPAバディは派生メソッド名を分析し、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. DBテーブルに基づくエンティティの生成

通常、データはコードよりも長持ちするため、既存のデータベース上にJPAデータレイヤーを構築する場合は、現在のテーブルに基づいてJPAエンティティを作成する必要があります。 JPA Buddyはこの機能を提供し、開発者が「チェリーピック」方式でエンティティを作成し、テーブルを1つずつ選択できるようにします。

既存のソリューションとは対照的に、プラグインは「スマート」生成を実行し、エンティティ間の関連付けを検出しようとします。 列で裏付けられていないOneToManyおよびManyToManyエンティティに対しても対応する属性を生成します。

JPAバディは、ID列のみと、そのような関連付けの本文にTODOコメントを持つ「空の」エンティティを生成します。 このTODOをクリックすると、既存のエンティティの列インポートプロセスを実行できます。

7. DTOとマッパーの生成

DTO は、JPAエンティティに直接マップできないデータを渡す場合の貴重なデザインパターンです。 たとえば、REST APIを作成するときに、一部のエンティティ属性のみを公開したい場合があります。

JPAバディは、MapStructライブラリを使用してDTOとマッパーを生成できます。 生成されたDTOに必要な属性を選択するだけです。

プラグインは、関連付けの適切なマッピングを含むDTOとマッパーを生成します。 JPA Buddyは、この場合もLombokをサポートし、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およびSpringFrameworkをサポートするためのバンドルされたプラグインからJPAバディ機能の一部を取得できます。 それでも、DBバージョニングスクリプトの生成とDTOの作成機能は、DB開発の自動化において独自のものであるように見えます。

For those who prefer video format, there is a fifteen-minute recording showing JPA Buddy in action. We can see how to create an application with JPA Buddy and Spring Boot using IntelliJ IDEA: