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ではこの問題を解決しています。
ソースコードに手を入れずに任意の型をドメインクラスとして扱うには、次のことを行います。
- ドメインクラスとして扱う型を特定する
- ドメインクラスと基本型を変換するクラス(コンバータ)を作成する
- コンバータを提供するためのクラス(プロバイダ)を作成する
- 注釈処理のオプションにプロバイダを指定する
以下に順に説明します。
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 { }