Squeak.ru - шаблоны программирования

Повторяющееся значение ключа нарушает уникальное ограничение исключение hibernate_sequences_pkey от Postgres

Мое приложение на основе Spring Data (JPA/Hibernate) вызывает при увеличении нагрузки при сохранении новых объектов в Postgres следующее исключение: org.postgresql.util.PSQLException: ОШИБКА: повторяющееся значение ключа нарушает уникальное ограничение «hibernate_sequences_pkey»

Стратегия для id определяется следующим образом:

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "ID")
public Long getId() {
    return id;
}

Я знаю, что эта стратегия не является идеальным решением для Postgres, однако является ли это причиной исключения выше?

Нагрузка генерируется с использованием маршрута Apache Camel с разделителем, выполняющим вставки параллельно в нескольких потоках.


Ответы:


1

После некоторых тестов кажется, что проблема действительно вызвана strategy = GenerationType.TABLE. С переходом на strategy = GenerationType.SEQUENCE исчезли описанные выше проблемы с дубликатами ключей.

@Id
@SequenceGenerator(name = Consts.VEHICLE_ATTR_ID_SEQ,
        sequenceName = Consts.VEHICLE_ATTR_ID_SEQ,
        allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
        generator = Consts.VEHICLE_ATTR_ID_SEQ)
@Column(name = "ID", updatable = false)
public Long getId() {
    return id;
} 
07.12.2017

2

При переходе с Hibernate 4 на 5.3.1 (Wildfly 14.0.1) я также столкнулся с проблемой, связанной с сообщением об ошибке «дублированное значение ключа нарушает уникальное ограничение« hibernate_sequences_pkey ». После изучения исходного кода Hibernate 5.3.1 я смог избавиться ошибки с помощью strategy = GenerationType.TABLE (я также знаю, что эта стратегия не является идеальным решением). Основная проблема была в классе TableGenerator. Для решения проблемы необходимо использовать дополнительно аннотацию GenericGenerator, например:

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = TableGenerator.DEF_TABLE)
@GenericGenerator(name = TableGenerator.DEF_TABLE, strategy
        = "org.hibernate.id.enhanced.TableGenerator", parameters = {
        @Parameter(name = TableGenerator.CONFIG_PREFER_SEGMENT_PER_ENTITY, value = "true")})
@Column(name="id")
private Integer id;

установка для параметра TableGenerator.CONFIG_PREFER_SEGMENT_PER_ENTITY значения true (поскольку по умолчанию он имеет значение false, и в этом случае Hibernate будет использовать имя сегмента «по умолчанию» в таблице hibernate_sequences вместо имен таблиц). Вы также должны установить для свойства hibernate.model.generator_name_as_sequence_name значение false, чтобы иметь только одну таблицу hibernate_sequences, в противном случае Hibernate будет использовать имена генераторов в качестве имен для таблиц последовательностей (согласно https://github.com/hibernate/hibernate-orm/фиксации/9a75fa8d979185b6014a814bf3ffd09e32143939#Diff-936141a440957cd8a9c4a93a744e92a0 изменений). Дополнительно (но не обязательно) вы также можете установить для свойства hibernate.id.generator.stored_last_used значение false (https://github.com/hibernate/hibernate-orm/commit/9af565510064635dba7e48087ab4e8f5ef439f0d изменяется), потому что:

Чтобы соответствовать спецификациям JPA, значение, сохраненное Hibernate 5.3 в таблице, используемой javax.persistence.TableGenerator, является последним сгенерированным значением. Предыдущие версии Hibernate вместо этого сохраняли следующее значение для использования.

Для обратной совместимости был введен новый параметр hibernate.id.generator.stored_last_used, который дает возможность вернуться к старому поведению Hibernate. Существующие приложения, переходящие на версию 5.3 и использующие @TableGenerator, должны установить hibernate.id.generator.stored_last_used в false.

14.04.2020
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...