java.util.Locale 属性は変換する必要がある

型が java.util.Locale の属性では、OpenJPA は型が VARCHAR(254) の列を作成しますが、EclipseLink は型が BLOB(64000) LOGGED NOT COMPACT の列を作成します。EclipseLink では、この違いのために、OpenJPA で作成された Locale 列を参照すると、java.io.CharConversionException が発生します。 OpenJPA と同じように Locale 属性を使用するには、EclipseLink で Java パーシスタンス型コンバーターを使用します。

この規則により、一過性ではなく、まだコンバーターがない、型が java.util.Locale の属性にフラグを立てます。 この問題を手動でマイグレーションするには、以下のステップに従います。

  1. 以下の例に示しているクラスのような Converter クラスを作成します。
  2. 永続ユニット定義にコンバーター・クラスを追加します。
  3. java.util.Locale フィールドに @Convert のアノテーションを付け、作成したコンバーター・クラスにコンバーター属性を設定します。

例えば、この規則により、以下のエンティティー・クラスの Locale 属性にフラグを立てます。

import java.util.Locale;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class LocaleEntity{
    @Id
    private int id;
    
    private Locale localeField;

}

コンバーター・クラスを作成します。 以下の例では、java.util.Locale のサンプル型コンバーター・クラスを示します。

import java.util.Locale;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter
public class LocaleConverter implements AttributeConverter<Locale, String> {

    public String convertToDatabaseColumn(Locale val) {
        return val.getLanguage() + "_" + val.getCountry()
                + "_" + val.getVariant();
    }

    public Locale convertToEntityAttribute(String str) {
        if (isNullOrEmpty(str))
            return null;
        String[] params = str.split("_", 3);
        if (params.length < 3)
            return null;
        return new Locale(params[0], params[1], params[2]);
    }

	private boolean isNullOrEmpty(String str) {
		return str==null || str.isEmpty();
	}

}

Locale 属性に @Convert のアノテーションを付けます。

import java.util.Locale;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class LocaleEntity{
    @Id
    private int id;
    
    @Convert(converter=LocaleConverter.class)
    private Locale localeField;

}

この問題や、OpenJPA から EclipseLink へのマイグレーションに関するその他の問題については、 OpenJPA to EclipseLink JPA Migration: Mappings ガイドを参照してください。