在Hibernate 4.x或5.x中映射java.util.Optional

时间:2016-01-11 09:20:13

标签: hibernate jpa

如何映射java.util.Optional类型的字段?我尝试了@Converter注释和AttributeConverter

@Converter
public class OptionalConverter<T> implements AttributeConverter<Optional<T>, T>{
    @Override
    public T convertToDatabaseColumn(Optional<T> attribute) {
        return attribute.orElse(null);
    }

    @Override
    public Optional<T> convertToEntityAttribute(T dbData) {
        return Optional.of(dbData);
    }
}

但它没有按计划进行。 Hibernate根本不支持任何指针或Optional?感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试通过以下方式强制使用转换器

// Entity field
@Convert(converter = OptionalConverter.class)
private Optional<Foo> foo;

,或者如果这样做没有帮助,则为特定的Optional类型实现转换器:

@Converter(autoApply = false)
public class OptionalFooConverter
    extends OptionalConverter<Foo>
    implements AttributeConverter<Optional<Foo>, Foo> { // this line is necessary when using EclipseLink
    @Override
    public Foo convertToDatabaseColumn(Optional<Foo> attribute) {
        return attribute.orElse(null);
    }

    @Override
    public Optional<Foo> convertToEntityAttribute(Foo dbData) {
        return Optional.of(dbData);
    }
}

// Entity field
@Convert(converter = OptionalFooConverter.class)
private Optional<Foo> foo;

由于实体类中的Optional字段还有其他缺点(例如,@NotNull可能无法按预期工作),因此您也可以将字段本身设置为常规的可为空值(非{{ 1}})输入并在getter和setter中进行转换。