【问题标题】:Jpa Enum how to map to column value with space in it?Jpa Enum如何映射到带有空格的列值?
【发布时间】:2018-07-11 19:36:54
【问题描述】:

我正在遵循以下 JPA 配置中的枚举教程。我的 JPA 已连接到 mysql 数据库。但是,枚举列中的某些值在其中包含空间。所以我创建了一个带有 String 字段的 Java 枚举类型来存储这些列值。

问题是,如何使用 JPA @Enumerated(Enum.TYPE = String) 注解映射这种复杂的枚举类型?好像不行。

The Enum example I followed.

我的 Enum 类型:

public enum Complex {

    VALUE1('value one'),
    VALUE2('value two'),

    private final String name;

    private Complex(String name) {
        this.name = name;

    }


}

【问题讨论】:

    标签: java mysql jpa enums


    【解决方案1】:

    对于 Hibernate,您的枚举中没有 name 属性这样的东西,所以这不会像那样工作。您将需要自定义序列化器/反序列化器。 Hibernate 如何知道它应该使用name 而不是像VALUE1 这样的枚举字符串形式,反之亦然?

    @Converter
    public class ComplexConverter implements AttributeConverter<Complex, String> {
     @Override
     public String convertToDatabaseColumn(Complex value){
         return value.name; //or whatever
     }
    
     @Override
     public Complex convertToEntityAttribute(String value) {
       ///// map string to Complex enum somehow
     }
    
    }
    

    在你的实体中

       @Column
       @Convert(converter = ComplexConverter.class)
       private Complex complex;
    

    未经测试,但应该可以工作并向您展示如何做到这一点。

    【讨论】:

    • 这是很好的开始。但是我的转换器被忽略了。谷歌搜索后,我看到了类似的事件。但我仍在调查。
    • 您可以尝试将转换器类添加到 persistence.xml 但这没有多大意义,因为您在注释中传递了 Class 实例,因此不需要声明。一般来说它应该可以工作 - 我过去做过类似的事情。
    • @user8328365 你还必须从转换后的列中删除Enumerated
    【解决方案2】:

    您可以发布错误吗?但是使用@Enumerated(Enum.TYPE = String),JPA 将持久化 VALUE1 或 VALUE2,并且表中的字段应该支持该数据类型。

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      相关资源
      最近更新 更多