java.util.Locale 속성을 변환해야 함

java.util.Locale 유형의 속성에 대해, OpenJPA는 VARCHAR(254) 유형의 열을 작성하는 반면 EclipseLink는 BLOB(64000) LOGGED NOT COMPACT 유형의 열을 작성합니다. 이러한 차이로 인해, EclipseLink에서 OpenJPA에 의해 작성된 Locale 열을 참조할 때 java.io.CharConversionException이 발생합니다. OpenJPA와 동일한 방식으로 Locale 속성을 사용하려면 EclipseLink에서 Java 지속성 유형 변환기를 사용하십시오.

이 규칙은 임시가 아니고 아직 변환기가 없는 java.util.Locale 유형의 속성에 플래그를 지정합니다. 이 문제를 수동으로 마이그레이션하려면 다음 단계를 수행하십시오.

  1. 다음 예에 표시된 클래스와 유사한 Converter 클래스를 작성하십시오.
  2. 지속성 단위 정의에 변환기 클래스를 추가하십시오.
  3. @Convert 어노테이션으로 java.util.Locale 필드에 어노테이션을 작성하고 변환기 속성을 작성한 변환기 클래스로 설정하십시오.

예를 들어, 이 규칙은 다음 엔티티 클래스의 Locale 속성에 플래그를 지정합니다.

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;

}

변환기 클래스를 작성하십시오. 다음 예는 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();
	}

}

@Convert 어노테이션으로 Locale 속성에 어노테이션을 작성하십시오.

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;

}

이 문제 및 기타 OpenJPA에서 EclipseLink로의 마이그레이션 문제에 대한 정보는 OpenJPA에서 EclipseLink JPA로 마이그레이션: 맵핑 안내서를 참조하십시오.