【问题标题】:Hibernate map list of enums without jointable没有可连接的枚举的休眠映射列表
【发布时间】:2015-05-29 11:44:29
【问题描述】:

我想以特定方式映射 Hibernate 中的枚举列表。

它应该保存为单个列中的逗号分隔的字符串数组,而不使用可连接的。

就像下面的注解将单个枚举值作为字符串保存在数据库中一样:

@Enumerated(EnumType.STRING)

我想使用类似ElementCollection 的注释来保存枚举列表或设置在保存枚举值列表的实体的数据库中的单个列中。

这可能吗?

【问题讨论】:

    标签: java hibernate enums


    【解决方案1】:

    不,对于@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, ",");
    }
    

    或者,您可以尝试使用 @ConverterList&lt;MyEnum&gt; 直接映射到 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) {
            ...
        }
    
    }
    

    【讨论】:

    • 感谢您的回答。 Hibernate Nverse 似乎与 AttributeConverters 不兼容 (hibernate.atlassian.net/browse/HHH-9042) 所以它会抱怨它无法确定枚举列表的类型。
    • 是的,看起来您对 Envers 的看法是正确的。但是,在错误 cmets 中提到了使用custom type 的解决方法,应该很容易测试。如果它适合你,你可以随时回退到我的第一个建议。
    • 休眠类型是否可以替代我的属性转换器?我应该使用 UserType 还是 CustomCollectionType? (因为它是一个列表)转换器看起来更简单,我应该将转换逻辑放在自定义 Type 的 nullSafeGet() 中吗?
    • 我自己从来没有使用过自定义类型,所以我不能告诉你什么会起作用。我会先尝试UserType,因为它看起来可以很快完成。这是一个集合,但包含枚举而不是实体,这就是我认为 UserType 可以工作的原因。
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2013-03-27
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多