【发布时间】:2015-05-29 11:44:29
【问题描述】:
我想以特定方式映射 Hibernate 中的枚举列表。
它应该保存为单个列中的逗号分隔的字符串数组,而不使用可连接的。
就像下面的注解将单个枚举值作为字符串保存在数据库中一样:
@Enumerated(EnumType.STRING)
我想使用类似ElementCollection 的注释来保存枚举列表或设置在保存枚举值列表的实体的数据库中的单个列中。
这可能吗?
【问题讨论】:
我想以特定方式映射 Hibernate 中的枚举列表。
它应该保存为单个列中的逗号分隔的字符串数组,而不使用可连接的。
就像下面的注解将单个枚举值作为字符串保存在数据库中一样:
@Enumerated(EnumType.STRING)
我想使用类似ElementCollection 的注释来保存枚举列表或设置在保存枚举值列表的实体的数据库中的单个列中。
这可能吗?
【问题讨论】:
不,对于@ElementCollection,您必须使用@CollectionTable,这是一个单独的数据库表,仅用于存储您的值(在这种情况下实际上更可取)。
您可以拥有一个简单的String 映射和几个实用方法,用于将 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) {
...
}
}
【讨论】:
UserType,因为它看起来可以很快完成。这是一个集合,但包含枚举而不是实体,这就是我认为 UserType 可以工作的原因。