型が 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 の属性にフラグを立てます。
この問題を手動でマイグレーションするには、以下のステップに従います。
Converter クラスを作成します。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 ガイドを参照してください。