2015-05-29 66 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