Atributele java.util.Locale trebuie să fie convertite

Pentru atributele de tip java.util.Locale, OpenJPA creează o coloană de tip VARCHAR(254), întrucât EclipseLink creează o coloană de tip BLOB(64000) LOGGED NOT COMPACT. În EclipseLink, această diferenţă cauzează o java.io.CharConversionException când faceţi referire la o colaonă Locale care a fost creată de OpenJPA. Pentru a folosi atributul Locale în acelaşi mod ca OpenJPA, folosiţi un convertor de tip persistenţă Java în EclipseLink.

Această regulă semnalează atribute de tip java.util.Locale care nu sunt tranzitorii şi nu au deja un convertor. Pentru a migra manual această problemă urmaţi aceşti paşi:

  1. Creaţi o clasă Converter similară cu clasa arătată în următorul exemplu.
  2. Adăugaţi clasa convertorului la definiţia persistenţă unitate.
  3. Adnotaţi câmpul java.util.Locale cu adnotarea @Convert şi setaţi atributul convertorului la clasa convertorului pe care aţi creat-o.

De exemplu, această regulă semnalează atributul Locale din clasa entitate următoare:

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;

}

Creaţi o clasă convertor. Următorul exemplu prezintă o clasă eşantion de convertor de tip pentru 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();
	}

}

Adnotaţi atributul Locale cu adnotarea @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;

}

Pentru informaţii despre această problemă şi alte probleme legate de migrarea OpenJPA la EclipseLink, vedeţi ghidul OpenJPA to EclipseLink JPA Migration: Mappings.