我有一张这样的桌子
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;
}为了转换枚举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);
}
}但是,如果枚举没有定义为entity类中的列,则看起来不会调用AttributeConverter类。在我的例子中,我使用hibernate-types来存储json。我如何存储枚举的值,而不是名称?
使用上面的代码,列json_col被存储在DB中,其枚举名称如下
{
"enumVal": "ABC"
}但是,我想像这样使用枚举值进行存储。
{
"enumVal": "abc.com"
}发布于 2021-01-21 18:17:52
正如documentation中所述
如果将
autoApply元素指定为true,则持久性提供程序必须自动将转换器应用于持久性单元中所有实体的指定目标类型的所有映射属性(通过Convert注释(或XML等效物)覆盖其转换的属性除外)。
您的属性的目标类型是JsonColumn,因此不会应用转换器。转换器将自动应用于以下字段,例如:
@Column
private TestEnum testColumn;https://stackoverflow.com/questions/65823666
复制相似问题