Bru*_*zzi 0 java hibernate jpa spring-data spring-data-jpa
我正在开发一个微服务,它曾经有一种与其中一个列相关的 Enum,但现在我不得不改变它。
@Convert(converter = TypeEnumConverter.class)
@Enumerated(EnumType.STRING)
@Column(name = "TIPO", length = 40, nullable = false)
private TypeEnum type;
Run Code Online (Sandbox Code Playgroud)
它是这样映射的,但是枚举名称和类型不兼容,如果它不能转换回该枚举,有没有办法告诉 JPA 忽略它?
您可以使用 AttributeConverter实现自定义枚举映射。在转换器中,您可以将未知的枚举值映射到null. 但请注意,下一次更新操作将从该数据库列中删除该值。
您已经在映射TypeEnumConverter的@Convert注释中引用了属性转换器。如果要使用它,则需要删除@Enumerated注释。JPA 规范不允许您将这 2 个注释一起使用,因为它们都定义了 Enum 值的映射方式。
以下是此类映射的示例。
我使用这个简单的Vehicle枚举:
public enum Vehicle {
BUS, CAR, TRAIN, PLANE;
}
Run Code Online (Sandbox Code Playgroud)
该属性转换器实现了Java对象并存储在数据库中的值之间的映射。它是一个简单的 Java 类,它实现了AttributeConverter接口并用@Converter. 如果将该autoApply属性设置为 true,它将自动用于转换类型的所有实体属性。
@Converter(autoApply = true)
public class VehicleConverter implements AttributeConverter<Vehicle, String> {
@Override
public String convertToDatabaseColumn(Vehicle vehicle) {
switch (vehicle) {
case Vehicle.BUS:
return "B";
case Vehicle.CAR:
return "C";
case Vehicle.TRAIN:
return "T";
case Vehicle.PLANE:
return "P";
}
}
@Override
public Vehicle convertToEntityAttribute(String dbData) {
switch (dbData) {
case "B":
return Vehicle.BUS;
case "C":
return Vehicle.CAR;
case "T":
return Vehicle.TRAIN;
case "P":
return Vehicle.PLANE;
default:
// ignore unknown values
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在实体类中使用枚举而无需任何其他映射注释。
@Entity
public class Trip {
private Vehicle vehicle;
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |