U atributů typu java.util.Locale vytvoří OpenJPA sloupec typu VARCHAR(254), zatímco EclipseLink vytvoří sloupec typu BLOB(64000) LOGGED NOT COMPACT.
V EclipseLink tento rozdíl způsobí výjimku java.io.CharConsisionException při odkazování na sloupec Locale, který byl vytvořen OpenJPA.
Chcete-li použít atribut Locale stejným způsobem jako OpenJPA, použijte konvertor typu perzistence Java v EclipseLink.
Toto pravidlo označí atributy typu java.util.Locale, které nejsou přechodné a nemají již konvertor.
Chcete-li provést ruční migraci tohoto problému, postupujte takto:
Converter podobnou třídě, která je uvedena v následujícím příkladu.java.util.Locale s anotací @Convert a nastavte atribut converter na vytvořenou třídu převodníku.
Toto pravidlo například označí atribut Locale v následující třídě entity:
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; } |
Vytvořte třídu převodníku.
Následující příklad zobrazuje stejnou třídu převodníku typů pro 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(); } } |
Anotujte atribut Locale s anotací @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; } |
Informace o tomto problému a jiných problémech migrace OpenJPA na EclipseLink viz příručka Migrace OpenJPA na EclipseLink JPA: Mapování.