Postgres + Гибернация + Java UUID
-
09-09-2019 - |
Вопрос
Я хочу использовать собственный тип UUID PostgreSQL с UUID Java.Я использую Hibernate в качестве своего JPA-провайдера и ORM.Если я попытаюсь сохранить его напрямую, он просто будет сохранен как bytea в Postgres.
Как я могу это сделать?
Решение
Попробуйте использовать последнюю версию драйвера JDBC для разработки (в настоящее время 8.4dev-700) или дождитесь выхода следующей версии.(Отредактировано для добавления:8.4-выпущен 701)
В примечания к выпуску упомяните об этом изменении:
Сопоставьте тип uuid базы данных с java.util.UUID.Это работает только для относительно новых версий server (8.3) и JDK (1.5).
Другие советы
Вот репост моего ответа на UUID Postgresql поддерживается Hibernate? ...Я знаю, что этот вопрос устарел, но если кто-то наткнется на него, это поможет ему.
Это может быть решено путем добавления следующей аннотации к UUID:
import org.hibernate.annotations.Type;
...
@Type(type="pg-uuid")
private java.util.UUID itemUuid;
Что касается того, почему Hibernate просто не делает это настройкой по умолчанию, я не мог бы вам сказать...
Обновить:Кажется, все еще существуют проблемы с использованием createNativeQuery
способ открытия объектов, имеющих поля UUID.К счастью, createQuery
метод до сих пор отлично работал для меня.
При использовании, отличном от JPA, я бы создал UserType для форматирования UUID в виде строки, которую принимает PostgreSQL, а затем просто указал имя реализации UserType в качестве типа столбца.
вы могли бы попробовать с:
@Column(name="foo", columnDefinition="uuid")
где ColumnDefinition - это фрагмент собственного SQL
Возможно, вы можете заставить тип UUID автоматически преобразовываться в строку (uuid.toString() должна предоставлять каноническое представление из 36 символов)?Базы данных обычно надежно преобразуют данные между строками и собственными типами.
Попробуй это
@Column(name = "UUID", nullable=false, insertable = false, columnDefinition="uuid DEFAULT uuid_generate_v4()")
private String uuid;