spring-boot - JPA AttributeConverter 不适用于 json 列字段中的枚举
问题描述
我有一张这样的桌子
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`json_col` json NOT NULL,
PRIMARY KEY (`id`)
)
我的数据模型看起来像这样
@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;
}
@AllArgsConstructor
@Getter
public enum TestEnum {
ABC("abc.com"),
DEF("def.com");
private String value;
}
public class JsonColumn {
private TestEnum enumVal;
}
要转换 enum TestEnum
,我使用以下AttributeConverter
@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);
}
}
AttributeConverter
但是,如果枚举未定义为实体类中的列,则似乎不会调用类。就我而言,我hibernate-types
用来存储 json。如何存储枚举及其值而不是名称?
使用上面的代码,列json_col
存储在 DB 中,枚举名称如下
{
"enumVal": "ABC"
}
但是,我想像这样存储枚举值。
{
"enumVal": "abc.com"
}
解决方案
正如文档中所述:
如果
autoApply
元素指定为true
,则持久性提供程序必须自动将转换器应用于持久性单元中所有实体的指定目标类型的所有映射属性,但通过 Convert 注释(或 XML 等效项)覆盖其转换的属性除外.
您的属性的目标类型JsonColumn
是不应用转换器。转换器将自动应用于以下字段,例如:
@Column
private TestEnum testColumn;
推荐阅读
- css - 如何使页脚向下并垂直?
- python - WebSocketBadStatusException:握手状态 200 OK
- spring-cloud-dataflow - SCDF - 如何在 Kubernetes 部署上配置远程 maven 存储库
- python - Kivy buildozer ImportError grpc 自定义配方
- javascript - 无限循环?有什么建议么?
- image-processing - 从位置数组Python 3中查找边界
- ruby-on-rails - 使用 Azure AD 登录后生成的 Cookie
- javascript - 在 iOS Safari 上触发 PDF 文件的下载提示
- reactjs - 反应井字游戏
- javascript - 用我自己的键将对象转换为这种格式的对象数组?