首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA AttributeConverter不能使用json列字段中的枚举

JPA AttributeConverter不能使用json列字段中的枚举
EN

Stack Overflow用户
提问于 2021-01-21 16:35:47
回答 1查看 230关注 0票数 1

我有一张这样的桌子

代码语言:javascript
复制
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `json_col` json NOT NULL,
  PRIMARY KEY (`id`)
)

我的数据模型如下所示

代码语言:javascript
复制
@Entity
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class ServiceVersion extends EntityAuditing {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  @NotNull
  @Type(type = "json")
  @Column(columnDefinition = "json")
  private JsonColumn jsonCol;
}
代码语言:javascript
复制
@AllArgsConstructor
@Getter
public enum TestEnum {
  ABC("abc.com"),
  DEF("def.com");

  private String value;
}
代码语言:javascript
复制
public class JsonColumn {
  private TestEnum enumVal;
}

为了转换枚举TestEnum,我使用下面的AttributeConverter

代码语言:javascript
复制
@Converter(autoApply = true)
public class EnumConverter implements AttributeConverter<TestEnum, String> {

  @Override
  public String convertToDatabaseColumn(TestEnum value) {
    if (value == null) {
      return null;
    }
    return value.getValue();
  }

  @Override
  public TestEnum convertToEntityAttribute(String value) {
    if (value == null) {
      return null;
    }

    return Stream.of(TestEnum.values())
        .filter(v -> v.getValue().equals(value))
        .findFirst()
        .orElseThrow(IllegalArgumentException::new);
  }
}

但是,如果枚举没有定义为entity类中的列,则看起来不会调用AttributeConverter类。在我的例子中,我使用hibernate-types来存储json。我如何存储枚举的值,而不是名称?

使用上面的代码,列json_col被存储在DB中,其枚举名称如下

代码语言:javascript
复制
{
  "enumVal": "ABC"
}

但是,我想像这样使用枚举值进行存储。

代码语言:javascript
复制
{
  "enumVal": "abc.com"
}
EN

回答 1

Stack Overflow用户

发布于 2021-01-21 18:17:52

正如documentation中所述

如果将autoApply元素指定为true,则持久性提供程序必须自动将转换器应用于持久性单元中所有实体的指定目标类型的所有映射属性(通过Convert注释(或XML等效物)覆盖其转换的属性除外)。

您的属性的目标类型是JsonColumn,因此不会应用转换器。转换器将自动应用于以下字段,例如:

代码语言:javascript
复制
@Column
private TestEnum testColumn;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65823666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档