2015-05-29 39 views
0

我想以特定方式映射Hibernate中的枚舉列表。休眠映射不包含連接表的列表

它應該保存爲逗號分隔的單個字符串數組,而不使用連接表。

就像下面的註釋保存一個枚舉值作爲數據庫中的字符串:

@Enumerated(EnumType.STRING) 

我想用一個ElementCollection式的註釋保存的枚舉或者在一列設置擁有枚舉值列表的實體的數據庫。

這可能嗎?

回答

0

不,@ElementCollection你必須使用@CollectionTable這是一個單獨的數據庫表,只是用來存儲你的值(實際上在這種情況下更可取)。

您可以使用簡單的String映射和一些util方法將CSV字符串轉換爲枚舉列表,反之亦然。這樣

private String myCSVValues; 
... 
public List<MyEnum> getMyEnums() { 
    String[] csvs = this.myCSVValues.split(","); 
    List<MyEnum> myEnums = new ArrayList<MyEnum>(); 
    for (String s : csvs) { 
     myEnums.add(MyEnum.valueOf(s)); 
    } 
    return myEnums; 
} 

public void setMyEnums(List<MyEnum> myEnums) { 
    this.myCSVValues = org.apache.commons.lang3.StringUtils.join(myEnums, ","); 
} 

或者,有些事情,你可以用@Converter嘗試將List<MyEnum>直接映射到VARCHAR列

@Converter(autoApply = true) 
public class MyEnumConverter implements AttributeConverter<List<MyEnum>, String> { 

    @Override 
    public String convertToDatabaseColumn(List<MyEnum> myEnums) { 
     ... 
    } 

    @Override 
    public List<MyEnum> convertToEntityAttribute(String dbData) { 
     ... 
    } 

} 
+0

謝謝您的回答。看起來雖然Hibernate Nverse與AttributeConverters不兼容(https://hibernate.atlassian.net/browse/HHH-9042)所以它會抱怨說它不能確定枚舉列表的類型。 – Cloud

+0

是的,看起來你對Envers來說是對的。但是,在錯誤評論中,通過使用[自定義類型](https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/types.html#types-custom)提到了一種解決方法。 ,應該很容易測試。如果它適合你,你總是可以回到我的第一個建議。 –

+0

休眠類型是否替換了我的attributeconverter?我應該使用UserType還是CustomCollectionType? (因爲它是一個列表)轉換器似乎更直截了當,我應該把轉換邏輯放在自定義類型的nullSafeGet()中嗎? – Cloud