Сопоставление 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
) введите и выполните преобразование в получателе и установщике.