About

ドキュメント

プロジェクト文書

Built by Maven

概要

Domain(ドメイン)クラスの定義方法を示します。 ドメインとは、値のとり得る範囲(定義域)のことです。 Domaでは、テーブルのカラムの値を、ドメインと呼ばれるJavaオブジェクトで扱います。

ドメインクラスを利用することで、データベース上のカラムの型が同じあってもアプリケーション上意味が異なるものを別のJavaの型で表現できます。 これにより、意味を明確にしプログラミングミスを事前に防ぎやすくなります。 また、ドメインクラスに振る舞いを持たせることで、よりわかりやすいプログラミングが可能です。

ドメインクラスの作成と利用は任意です。 ドメインクラスを利用しなくてもIntegerStringなど基本型のみでデータアクセスは可能です。

ドメイン定義

ドメインクラスは @Domainを注釈して示します。

@DomainvalueType要素には、ドメインクラスで扱う基本型を指定します。この基本型が、データベースのカラムの型とのマッピングに使用されます。

accessorMethod要素には、valueType要素に指定した型を返すアクセッサーメソッドの名前を指定します。デフォルト値はgetValueです。

以下の例では、 電話番号を表すドメインクラスを作成しています。

package example.domain;

import org.seasar.doma.Domain;

@Domain(valueType = String.class)
public class PhoneNumber {

    private final String value;

    public PhoneNumber(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public String getAreaCode() {
       // ドメインに固有の振る舞いを記述できる。
       ...
    }
}

クラスには、valueType要素に指定した型と同じ型をもつ非privateなコンストラクタが必要です。 また、accessorMethod要素にしてした値を名前とする非privateなメソッドが必要です。

任意ですが、ドメインクラスは不変オブジェクトとして作成することを推奨します。 上記の例では、valueフィールドは一度設定されると二度と変更されません。

クラスには、任意のメソッドを持たせることができます。

利用例

エンティティクラス

エンティティクラスのフィールドの型での利用例です。

@Entity
public class Employee {

    @Id
    Integer employeeId;

    String employeeName;

    PhoneNumber phoneNumber;

    @Version
    Integer versionNo();
    
    ...
}

Daoインタフェース

Daoインタフェースのメソッドのパラメータや戻り値での利用例です。

@Dao(config = AppConfig.class)
public interface EmployeeDao {

    @Select
    Employee selectByPhoneNumber(PhoneNumber phoneNumber);
    
    @Select
    List<PhoneNumber> selectAllPhoneNumber();
}