Сопоставление java.util. Опционально в Hibernate 4.x или 5.x

Как мне сопоставить поле типа 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);
    }
}

Но все пошло не так, как планировалось. Любые указатели или Optional вообще не поддерживается в Hibernate? Благодарю.

1 ответ

Вы можете попытаться принудительно использовать конвертер, используя

// 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 может работать не так, как задумано), вы также можете иметь само поле как обычное обнуляемое (неOptional) введите и выполните преобразование в получателе и установщике.

Другие вопросы по тегам