2013-02-14 1 views
3

JPA (EclipseLink 제공자)와 Java enum 유형에 postgreSQL ENUM 유형 (또는 그 반대로)을 매핑하려고합니다.JPA (EclipseLink) 및 사용자 정의 변환기로 Java enum에 postgreSQL enum 맵핑

은 내가 쉽게 @Enumerated 주석 내 PostgreSQL 데이터베이스에 varchar 유형 자바 열거를 매핑 할 수 있습니다 알고 있지만 나는 PostgreSQL을 ENUM tpye에 매핑 할. 이 작업을 수행하려면 사용자 정의 EclipseLink 변환기를 사용해야한다고 생각합니다.

그래서, 나는 org.eclipse.persistence.mappings.converters.Converter을 구현하기 위해 시작했지만 나는 convertObjectValueToDataValueinitializeisMutable 방법 ...

사람이 어떻게 이러한 방법을하시기 바랍니다 구현하는 나를 설명 할 수을 구현하는 방법을 kown하지? 지금은

내 클래스는 하나입니다 설명에 대한

public class EnumConverter implements Converter { 

private static final long serialVersionUID = 1L; 

public Object convertDataValueToObjectValue(Object object, Session session) { 

    if(object instanceof PGobject){ 
     return LangageEnum.valueOf(LangageEnum.class, ((PGobject)object).getValue());   
    } 

    return null; 
} 

public Object convertObjectValueToDataValue(Object object, Session session) { 
    // WHAT HERE...? 
    // I tried to play with PGObject witout success... 
    return object; 
} 

public void initialize(DatabaseMapping arg0, Session arg1) { 
    // WHAT INITIALIZATION HERE...? 
} 

public boolean isMutable() { 
    // TRUE OR FALSE AND WHY...? 
    return false; 
} 

} 

@Converter(name="langageConverter", converterClass=EnumConverter.class) 
@Convert(value="langageConverter") 
private LangageEnum langage; 

덕분에, 나는 구글과는 EclipseLink에 대한 사용자 정의 변환기를 검색하지만 이번에 구글 내 친구가 아니었다.

답변

3

좋아, 내가 다른 프로젝트에서 기본 SELECT 문을 몇 가지 테스트를 만들어 내 PostgreSQL을 ENUM 유형의 값으로 설정 값으로 PGObject로 반환되는 것을보고 내 ENUM (내 경우 FR, EN 또는 DE에서)와와 내 열거 형 이름의 유형.

예 : 내가 페이지에서 다음 ENUM을 만들 경우 :

CREATE TYPE langage AS ENUM ('FR', 'EN', 'DE'); 

내가 값 FR 또는 EN 또는 DE로 입력 langage으로 PGObject을 받게됩니다. 내 ENUM에 자바 객체를 변환 할 때

그래서, 나는 단순히 정의는 EclipseLink Converter를 작성하고 convertObjectValueToDataValue이 같은 PGObject을 반환 :

public class EnumConverter implements Converter { 

private static final long serialVersionUID = 1L; 

private static Logger logger = Logger.getLogger(EnumConverter.class); 

public Object convertDataValueToObjectValue(Object object, Session session) { 

    if(object instanceof PGobject){ 
     return LangageEnum.valueOf(LangageEnum.class, ((PGobject)object).getValue());   
    } 

    return null; 
} 

public Object convertObjectValueToDataValue(Object object, Session session) { 

    if(object instanceof LangageEnum){ 

     PGobject pg = new PGobject(); 

     try { 
      pg.setValue(((LangageEnum)object).name()); 
      pg.setType("langage"); 
     } catch (SQLException e) { 
      logger.log(Level.FATAL, e); 
     } 

     return pg; 
    } 

    return object; 
} 

public void initialize(DatabaseMapping dm, Session session) { 
    dm.getField().setSqlType(Types.OTHER); 
} 

public boolean isMutable() { 
    return true; 
} 

} 

을 그리고 훌륭한 일입니다.

희망이 도움이됩니다.

+0

아마 많이 바뀌지는 않지만'ENUM' 유형에 대해'isMutable()'false'를 반환하지 않아야합니까? – Martin