Lombok サポート

Doma は、Lombok 1.16.12 以降をサポートしています。

注釈

Eclipse を使用する場合は、バージョン 4.5 以降を使用してください。

概要

LombokとDomaの両方がアノテーションプロセッサを利用しています。Javaはアノテーションプロセッサの実行順序を特定の順番で保証していません。つまり、DomaのプロセッサがLombokがクラスの変更を終える前に実行される可能性があります。

この問題を解決するために、DomaのアノテーションプロセッサはLombokのアノテーションのいくつかを認識し、その動作を調整します。例えば、Domaのアノテーションプロセッサが @lombok.Value が付けられたクラスを見つけると、そのクラスには全てのインスタンスフィールドに対応するパラメータを持つコンストラクタがあると仮定します。

ベストプラクティス

こちらは、DomaクラスでLombok注釈を使用するための推奨パターンです。

エンティティクラスの定義

不変エンティティクラス

  • @Entityimmutable 要素に true を指定する

  • @lombok.Value または @lombok.AllArgsConstructor のいずれかを指定する

  • @lombok.AllArgsConstructor の場合、ゲッターを生成するには @lombok.Getter を指定する

@Entity(immutable = true)
@Value
public class Employee {
  @Id
  Integer id;
  String name;
  Age age;
}
@Entity(immutable = true)
@AllArgsConstructor
@Getter
public class Worker {
  @Id
  private final Integer id;
  private final String name;
  private final Age age;
}

可変エンティティクラス

  • デフォルトのコンストラクターを定義する

  • ゲッター/セッターを生成するには、@lombok.Data または @lombok.Getter/@lombok.Setter を指定する

@Entity
@Data
public class Person {
  @Id
  private Integer id;
  private String name;
  private Age age;
}
@Entity
@Getter
@Setter
public class Businessman {
  @Id
  private Integer id;
  private String name;
  private Age age;
}

ドメインクラスの定義

  • @lombok.Value を指定する

  • value という名前のインスタンスフィールドを 1 つだけ定義する

@Domain(valueType = Integer.class)
@Value
public class Age {
  Integer value;
}

埋め込み可能クラスの定義

  • @lombok.Value または @lombok.AllArgsConstructor のいずれかを指定する

  • @lombok.AllArgsConstructor の場合、ゲッターを生成するには @lombok.Getter を指定する

@Embeddable
@Value
public class Address {
  String street;
  String city;
}
@Embeddable
@AllArgsConstructor
@Getter
public class Location {
  private final String street;
  private final String city;
}