A java.util.Locale típusú attribútumok esetén az OpenJPA egy
VARCHAR(254) típusú oszlopot hoz létre, míg az EclipseLink
egy BLOB(64000) LOGGED NOT COMPACT típusú oszlopot.
Az EclipseLink esetén ez a különbség egy
java.io.CharConversionException kivételt okoz, amikor egy
OpenJPA használatával létrehozott Locale oszlopra
hivatkozik.
A Locale attribútum használatához a
OpenJPA megvalósítással megegyező módon, használjon egy Java perzisztencia
típusátalakítót az EclipseLink környezetben.
Ez a szabály megjelöli a java.util.Locale típusú
attribútumokat, amelyek nem átmenetiek, és még nem rendelkeznek egy
átalakítóval.
A probléma kézi átállításához tegye a következőket:
Converter osztály.java.util.Locale mezőt a
@Convert annotációval, és állítsa be az átalakító
attribútumot a létrehozott átalakító osztályra.
Például ez a szabály megjelöli a Locale
attribútumot a következő egyedosztályokban:
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; } |
Hozzon létre egy Converter osztályt.
A következő példa egy minta típusátalakító osztályt hoz létre a
java.util.Locale osztályhoz.
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(); } } |
Jelölje meg a Locale attribútumot a @Convert
annotációval.
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; } |
A problémával és más OpenJPA - EclipseLink átállítási problémákkal kapcsolatos információkért tekintse meg az OpenJPA - EclipseLink JPA átállítás: Leképezések útmutatót.