Doma 1.25.0 で追加した DOMA-264 の機能の解説

以前までのバージョンでは、DBのカラムにマッピングするクラスをリッチな型(ドメインクラス)にする場合、その型に@Domainという注釈をつける必要がありました。
たとば、次のようなエンティティクラスがあって、

@Entity
public class Employee {

    @Id
    Integer id;

    String name;

    @Column(name = "JOB_TYPE")
    JobType jobType;
}

JobTypeという型をDBのvarchar型とマッピングさせたい場合、次のようにJobTypeに@Domainの注釈が必要でした。

@Domain
public enum JobType { ... }


この方法には、ソースコードに手を入れられない場合には使用できない、という大きな問題がありました。
DOMA-264ではこの問題を解決しています。


ソースコードに手を入れずに任意の型をドメインクラスとして扱うには、次のことを行います。

  1. ドメインクラスとして扱う型を特定する
  2. ドメインクラスと基本型を変換するクラス(コンバータ)を作成する
  3. コンバータを提供するためのクラス(プロバイダ)を作成する
  4. 注釈処理のオプションにプロバイダを指定する


以下に順に説明します。

DBのカラムにマッピングするドメインクラスを特定する

DBのカラムにマッピングするドメインクラスとして次の列挙型を使います。ソースコードに手を入れることができないと想定してください。

public enum JobType {
    SALESMAN, MANAGER, ANALYST
}
ドメインクラスと基本型を変換するクラス(コンバータ)を作成する

ここでは、DBのカラムに格納されたコード値とJobType列挙型を相互に変換する処理を記述します。
@ExternalDomainを注釈して、DomainConverterをimplementsするのがポイントです。

@ExternalDomain
public class JobTypeConverter implements DomainConverter<JobType, String> {

    @Override
    public String fromDomainToValue(JobType domain) {
        switch (domain) {
        case SALESMAN:
            return "10";
        case MANAGER:
            return "20";
        case ANALYST:
            return "30";
        default:
            throw new IllegalArgumentException();
        }
    }

    @Override
    public JobType fromValueToDomain(String value) {
        if ("10".equals(value)) {
            return JobType.SALESMAN;
        }
        if ("20".equals(value)) {
            return JobType.MANAGER;
        }
        if ("30".equals(value)) {
            return JobType.ANALYST;
        }
        throw new IllegalArgumentException();
    }
}
コンバータを提供するためのクラス(プロバイダ)を作成する

@DomainConvertersを注釈して、アプリで使うコンバータを指定します(複数指定可)。
クラス名はなんでもOK。

@DomainConverters({ JobTypeConverter.class })
public class DomainConvertersProvider {
}
注釈処理のオプションにプロバイダを指定する

key に domain.converters を、value に プロバイダの完全修飾名を指定してください。
Eclipseの注釈処理オプション設定画面です(画像をクリックしてさらに「オリジナルサイズを表示」をクリックしてください)。


これで、任意の型をドメインクラスとして扱えます。
以上、Doma 1.25.0 で追加した DOMA-264 の機能の解説でした。

ちなみに

DOMA-264の解説に登場するドメインクラスは、あくまでDBのカラム1つをマッピングするものです。
複数カラムをまとめて扱いたいときは、エンティティのgetter/setterをうまく使ってオブジェクトを「まとめ」たり「バラシ」たりするのがお奨めです。
https://gist.github.com/3945704

DomaはエンティティのフィールドをDBのカラムとマッピングさせるので、getter/setterで何かしても、Domaの振る舞いに影響しません。