A java.util.Locale attribútumokat át kell alakítani

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:

  1. Hozzon létre egy, a következő példában láthatóhoz hasonló Converter osztály.
  2. Adja hozzá a Converter osztályt a perzisztencia egység meghatározásához.
  3. Jelölje meg a 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.