Per gli attributi di tipo java.util.Locale, OpenJPA crea una colonna di tipo VARCHAR(254), mentre EclipseLink crea una colonna di tipo BLOB(64000) LOGGED NOT COMPACT.
In EclipseLink, questa differenza genera un'eccezione java.io.CharConversionException quando si fa riferimento alla colonna Locale creata da OpenJPA.
Per utilizzare l'attributo Locale nella stessa maniera OpenJPA, utilizzare un convertitore di tipo di persistenza Java in EclipseLink.
Questa regola contrassegna gli attributi di tipo java.util.Locale che non sono transitori e non hanno già un convertitore.
Per migrare manualmente, effettuare le seguenti operazioni:
Converter simile alla classe mostrata nel seguente esempio.java.util.Locale con l'annotazione @Convert ed impostare l'attributo converter con la classe del convertitore creata.
Ad esempio, questa regola contrassegna l'attributo Locale nella classe di entità seguente:
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; } |
Creare una classe del convertitore.
Il seguente esempio mostra una classe del covertitore del tipo di esempio per 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(); } } |
Annotare l'attributo Locale con l'annotazione @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; } |
Per informazioni su questo problema e altri problemi della migrazione da OpenJPA a EclipseLink, consultare la guida OpenJPA to EclipseLink JPA Migration: Mappings.