2015年3月18日水曜日

JPA2.1のConverterを使ってEntityの属性の型変換

JPA2.1では、Entityの属性にConverterが設定できて、DBへの保存時や取得時に型変換を行うことができる。

使用方法


Converterクラスの作成

Converterクラスは、javax.persistence.AttributeConverterインタフェースをを実装し、javax.persistence.Converterアノテーションを設定する。
AttributeConverterの総称型には、Entityの属性の型とDBへ挿入する型を指定する。

このコードの例だと、Sex列挙型の値をStringに変換してDBに登録します。
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

import jpa.entity.Sex;

@Converter
public class SexConverter implements AttributeConverter<Sex, String> {

    @Override
    public String convertToDatabaseColumn(Sex attribute) {
        return attribute.toString();
    }

    @Override
    public Sex convertToEntityAttribute(String dbData) {
        return Sex.valueOf(dbData);
    }
}

Entityの実装

変換対象のカラムにjavax.persistence.Convertアノテーションを指定する。
このアノテーションのconverter属性に、先ほど作成したConverterクラスを指定する。
@Entity
@Table(name = "user_info")
public class User {

    private Long id;

    private Sex sex;

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column
    @Convert(converter = SexConverter.class)
    public Sex getSex() {
        return sex;
    }

    public void setSex(Sex sex) {
        this.sex = sex;
    }
}

実行

以下のコードで、Sex列挙型の項目がDBに文字列で保存されることを確認します。
final User user = new User();
user.setSex(Sex.MALE);
em.persist(user);
DBの値は下の結果のように列挙型の文字列表記になっています。
ID           SEX
---------- --------------------
1            MALE