Unrecognized id type pg uuid java util uuid

Is there a way to use Postgres’ UUID generation with Hibernate’s IDENTITY ID generation strategy?

I’m using Spring Boot 1.4.1, which includes Hibernate 5, with Postgres 9.6, and I’m trying to create an entity with a UUID ID but using Postgres’ UUID generation instead of Hibernate’s. Many similar questions say to set the column type as pg-uuid . That seems to work for non-database-generated ID columns, but when I try to use it for the ID column I get org.hibernate.id.IdentifierGenerationException: unrecognized id type : pg-uuid -> java.util.UUID So it looks like Hibernate is applying the type correctly, but not converting it. Here is how the ID column of my entity is setup:

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @org.hibernate.annotations.Type(type="pg-uuid") private UUID id; 
create table example ( id UUID NOT NULL DEFAULT uuid_generate_v1mc(), . ); 

I would prefer to have the database generate the UUIDs and don’t want to use Hibernate’s generation strategies. Is there a way to get this to work?

1 Answer 1

One way to solve this is to create a custom UserType that implements ResultSetIdentifierConsumer . For a quick-and-dirty example, create a class called PostgresIdUUIDType that extends PostgresUUIDType while implementing the interface:

public class PostgresIdUUIDType extends PostgresUUIDType implements ResultSetIdentifierConsumer < // Naively look for a name that contains "id" in it, case insensitive private static final Pattern idPattern = Pattern.compile("id", Pattern.CASE_INSENSITIVE); public String getName() < return "pg-id-uuid"; >@Override public UUID consumeIdentifier(final ResultSet resultSet) throws IdentifierGenerationException < try < final int columnCount = resultSet.getMetaData().getColumnCount(); for (int i = 1; i @Override public LobCreator getLobCreator() < return null; >@Override public SqlTypeDescriptor remapSqlTypeDescriptor(final SqlTypeDescriptor sqlTypeDescriptor) < return PostgresUUIDSqlTypeDescriptor.INSTANCE; >>); > > > throw new IdentifierGenerationException("Could not find id column"); > catch (SQLException e) < throw new IdentifierGenerationException("Error converting type", e); >> > 
@TypeDefs(<@TypeDef(name = "pg-id-uuid", typeClass = PostgresIdUUIDType.class) >) @Entity public class Example

This seems to work in my limited testing so far. The biggest problem is the PostgresIdUUIDType naïvely assumes that the UUID ID column is the first column with ‘id’ in the name, case insensitively. If anyone has ideas for how to better determine which column is actually the ID column, I’d appreciate the tweak.

Источник

Есть ли способ использовать генерацию UUID в Postgres со стратегией генерации ID IDITY Hibernate?

Я использую Spring Boot 1.4.1, который включает Hibernate 5, с Postgres 9.6, и я пытаюсь создать сущность с идентификатором UUID, но используя генерацию UUID Postgres вместо Hibernate. Многие подобные вопросы говорят, чтобы установить тип столбца как pg-uuid . Кажется, что это работает для столбцов идентификаторов, созданных без базы данных, но когда я пытаюсь использовать его для столбца ID, я получаю org.hibernate.id.IdentifierGenerationException: unrecognized id type: pg-uuid → java.util.UUID Таким образом, похоже, что Hibernate корректно применяет тип, но не преобразовывает его. Вот как устанавливается столбец идентификатора моего объекта:

@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @org.hibernate.annotations.Type(type="pg-uuid") private UUID id; 
create table example ( id UUID NOT NULL DEFAULT uuid_generate_v1mc(), . ); 

Я бы предпочел, чтобы база данных генерировала UUID и не хотела использовать стратегии генерации Hibernate. Есть ли способ заставить это работать?

2 ответа

@Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; 

Один из способов решения этой проблемы — создать пользовательский UserType, который реализует ResultSetIdentifierConsumer . Для быстрого и грязного примера создайте класс PostgresIdUUIDType который расширяет PostgresUUIDType при реализации интерфейса:

public class PostgresIdUUIDType extends PostgresUUIDType implements ResultSetIdentifierConsumer < // Naively look for a name that contains "id" in it, case insensitive private static final Pattern idPattern = Pattern.compile("id", Pattern.CASE_INSENSITIVE); public String getName() < return "pg-id-uuid"; >@Override public UUID consumeIdentifier(final ResultSet resultSet) throws IdentifierGenerationException < try < final int columnCount = resultSet.getMetaData().getColumnCount(); for (int i = 1; i @Override public LobCreator getLobCreator() < return null; >@Override public SqlTypeDescriptor remapSqlTypeDescriptor(final SqlTypeDescriptor sqlTypeDescriptor) < return PostgresUUIDSqlTypeDescriptor.INSTANCE; >>); > > > throw new IdentifierGenerationException("Could not find id column"); > catch (SQLException e) < throw new IdentifierGenerationException("Error converting type", e); >> > 

Затем в вашей организации определите настраиваемый тип и используйте его для своего столбца идентификатора следующим образом:

@TypeDefs(<@TypeDef(name = "pg-id-uuid", typeClass = PostgresIdUUIDType.class) >) @Entity public class Example

На данный момент это работает в моем ограниченном тестировании. Самая большая проблема заключается в том, что PostgresIdUUIDType наивно предполагает, что столбец идентификатора UUID — это первый столбец с идентификатором «id» в имени, без учета регистра. Если у кого-то есть идеи о том, как лучше определить, какой столбец на самом деле является столбцом ID, я был бы признателен за настройку.

Ещё вопросы

  • 0 Подогнать изображение в DIV в Internet Explorer 8
  • 0 Как я могу передать свой заводской результат другому контроллеру?
  • 0 Несколько соединений TCP против одного соединения
  • 0 Как отключить функцию .change при загрузке страницы
  • 1 Как удалить файл, используя его путь на Android 7?
  • 1 JAX-WS + Hibernate + JAXB: как избежать исключения LazyInitializationException во время сортировки
  • 0 Инжекция $ cookies angular.js в контроллер
  • 0 jQuery Mobile: уберите метку с диапазона и сделайте слайдер шире
  • 1 Данные не сохраняются в переменной ModelList в цикле. «Индекс был вне диапазона»
  • 0 Запрос OpenCart SQL и отображение на странице шаблона продукта
  • 1 Скрепка с ActionCable
  • 0 Ошибка: «Ответ» не был объявлен в этой области
  • 1 Node.js aes-256-cbc в Java
  • 0 Как я могу получить конкретный текст с веб-страницы
  • 0 Дизайн синхронизации потоков Qt
  • 0 Как перейти в режим мониторинга с помощью NDIS?
  • 0 Раскрывающееся меню jQuery открывает все подменю
  • 1 Java Rect.intersects () иногда не работает
  • 0 Как я могу непрерывно запускать функцию после добавления данных и завершения работы с этими данными
  • 1 Вы можете подавить запрос «Duplicate Mark» в Revit во время программы на c #?
  • 0 Неверно сформированный URL передан фабрике angularjs
  • 1 я могу заменить regExp другим regExp?
  • 0 C ++ не может заполнить данные
  • 0 Отладка без отладочных символов
  • 0 Вектор подмножеств
  • 0 Firefox мой тд текст не выравнивается в середине ячейки
  • 0 Объединить 2 ассоциативных массива путем сопоставления значения подмассива?
  • 0 Получить данные из базы данных и создать необходимый формат JSON
  • 0 Трансляция между службами
  • 0 Ява: Разбор Json правильно?
  • 0 Разрешить теги php в htmlpurifier
  • 0 Как правильно получить ресурсы с условно-инициализированными объектами в C ++?
  • 1 Функция module.exports не является функцией
  • 1 Как конвертировать дату в метку времени
  • 1 WCF замедляется с несколькими запросами
  • 0 «Captcha.php» не генерирует ответ на локальном сервере
  • 0 Как добавить текстовое поле и раскрывающийся список к значению массива?
  • 1 Как проверить все флажки в списке флажков при первой загрузке страницы?
  • 1 Использование System.Diagnostic.Process.Start и присвоение параметров во внешнем .exe файле
  • 0 Конвертировать массив php в гораздо меньший json?
  • 0 Как изменить строки со столбцами в матрице с одинаковой шириной?
  • 0 Ionic + Facebook Войти с помощью openfb.js
  • 1 xna c # перехватить и отменить кнопку закрытия окна (x) и Ctrl F4
  • 1 Как можно создать / удалить файлы в / data / data dir с помощью root в Android?
  • 1 NAudio Asio Запись и воспроизведение
  • 0 SFINAE выбор перегрузки для имеет или не имеет оператора
  • 0 Boost Spirit.Lex ре-лексирование измененных строк с использованием состояния из предыдущей строки
  • 0 Перенаправление с .htaccess и его паролем защищены
  • 1 Руководство по GStreamer для Android не удалось построить
  • 1 Как бороться с зависимыми полями при сериализации?

Источник

Читайте также:  Формирование документа в новом окне
Оцените статью