有没有办法让 JPA 忽略无效的枚举类型?

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 忽略它?

Tho*_*sen 5

您可以使用 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)