Gli attributi java.util.Locale devono essere convertiti

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:

  1. Creare una classe Converter simile alla classe mostrata nel seguente esempio.
  2. Aggiungere la classe converter alla definizione dell'unità di persistenza.
  3. Annotare il campo 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.