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 유형의 속성에
플래그를 지정합니다.
이 문제를 수동으로 마이그레이션하려면 다음 단계를 수행하십시오.
Converter 클래스를 작성하십시오.@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로 마이그레이션: 맵핑 안내서를 참조하십시오.