2012-11-09 97 views
0

我嘗試使用EclipseLink的Converter將Enum轉換爲BigDecimal。轉換工作,但生成的數據庫列有一種類型的字符串。是否可以設置參數,EclipseLink在數據庫中構建小數列類型?EclipseLink將Enum轉換爲BigDecimal

我使用了一個類,它實現了org.eclipse.persistence.mappings.converters.Converter。

應用服務器日誌

默認表生成器無法找到或轉換爲Java類型(空)到數據庫字段(XYZ)的數據庫類型。生成器使用java.lang.String作爲字段的默認Java類型。

此消息是針對使用轉換器的每個字段生成的。我如何爲這些字段定義特定的數據庫類型?

public enum IndirectCosts { 

EXTENDED { 
    public BigDecimal getPercent() { 
     return new BigDecimal("25.0"); 
    } 
}, 
NORMAL { 
    public BigDecimal getPercent() { 
     return new BigDecimal("12.0"); 
    } 
}, 
NONE { 
    public BigDecimal getPercent() { 
     return new BigDecimal("0.0"); 
    } 
}; 

public abstract BigDecimal getPercent(); 

public static IndirectCosts getType(BigDecimal percent) { 
    for (IndirectCosts v : IndirectCosts.values()) { 
     if (v.getPercent().compareTo(percent) == 0) { 
      return v; 
     } 
    } 
    throw new IllegalArgumentException(); 
} 
} 

數據庫必須存儲數值。我用這樣的轉換器:

public class IndirectCostsConverter implements Converter { 

@Override 
public Object convertObjectValueToDataValue(Object objectValue, Session session) { 
    if (objectValue == null) { 
     return objectValue; 
    } else if (objectValue instanceof IndirectCosts) { 
     return ((IndirectCosts) objectValue).getPercent(); 
    } 
    throw new TypeMismatchException(objectValue, IndirectCosts.class); 
} 

@Override 
public Object convertDataValueToObjectValue(Object dataValue, Session session) { 
    if (dataValue == null) { 
     return dataValue; 
    } else if (dataValue instanceof String) { 
     return IndirectCosts.getType(new BigDecimal((String) dataValue)); 
    } 
    throw new TypeMismatchException(dataValue, BigDecimal.class); 
} 

@Override 
public boolean isMutable() { 
    return false; 
} 

@Override 
public void initialize(DatabaseMapping databaseMapping, Session session) { 
} 
} 

convertDataValueToObjectValue(Object我必須使用String因爲SQL生成器定義的數據庫列爲varchar(255)。我想要十進制(15,2)或其他東西。

非常感謝 安德烈

回答

1

的的EclipseLink Converter接口定義了一個初始化(DatabaseMapping映射,會話會話);方法,您可以使用它來設置字段使用的類型。其他人發佈了一個示例來演示如何從映射中獲取字段:Using UUID with EclipseLink and PostgreSQL

DatabaseField的columnDefinition(如果設置)將是用於定義DDL生成類型的唯一東西,因此請仔細設置它。其他設置(非空,可爲空等)將僅在columnDefinition未設置時使用。