Hibernate сгенерированный идентификатор причины сообщения об ошибке: «ключ уже существует» - PullRequest
0 голосов
/ 25 февраля 2020

Я использую приложение Spring с Hibernate и postgres для хранения данных. Конфигурация для сущности продукта следующая:

/**
 * A Product.
 */
@Entity
@Table(name = "product")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "product")
public class Product implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    ...

}

Когда я хочу создать продукт с помощью веб-приложения, я получаю следующую ошибку duplicate key value violates unique constraint. Detail : the key (id)=(35018) already exists.

Из моего понимания использования в спящем режиме последовательность в дБ для генерации следующего значения идентификатора. Поэтому я сделал SELECT c.relname FROM pg_class c WHERE c.relkind = 'S'; в оболочке psql, чтобы получить всю последовательность в моей БД. Вывод:

hibernate_sequence
 jhi_user_id_seq
 key_value_id_seq
 jhi_persistent_audit_event_event_id_seq
 unit_id_seq
 generic_user_id_seq
 currency_id_seq
 customer_type_id_seq
 customer_exploitation_type_id_seq
 legal_entity_id_seq
 deposit_id_seq
 machine_id_seq
 tank_id_seq
 address_id_seq
 product_id_seq
 rewarded_file_id_seq
 bar_code_type_id_seq
 quality_label_id_seq
 shop_pdv_id_seq
 brand_id_seq
 category_id_seq
 material_id_seq
 ws_call_id_seq
 postal_code_id_seq
 commune_id_seq
 country_id_seq
 event_id_seq
 event_type_id_seq
 key_blob_id_seq
 card_id_seq

Так что я подумал, что у меня есть product_id_seq, и мне нужно только обновить значение, чтобы все работало. Но когда я запрашиваю значение с помощью SELECT * FROM product_id_seq;, я получаю:

 last_value | log_cnt | is_called
------------+---------+-----------
     100616 |       0 | t

Так что здесь я думаю, что идентификатор, сгенерированный для идентификатора продукта, не исходит из этого product_id_sequence, так как он пытается вставить продукт с id = 35018, а последнее значение product_id_seq равно 100616.

Так что мне интересно, откуда этот идентификатор 35018? Какая последовательность используется для ее генерации? Я думаю, мне нужно обновить эту загадочную последовательность, чтобы заставить вещи работать. Для информации последовательность hibernate имеет значение 36400.

Любая идея, которая могла бы привести меня в движение? Заранее спасибо.

1 Ответ

5 голосов
/ 28 февраля 2020

Вы не сопоставляете свою последовательность с последовательностью postgre, поэтому Hibernate создает последовательность hibernate_sequence (ту, из которой вы получили 35018) для себя.

Чтобы использовать существующую последовательность:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator",  sequenceName = "product_id_seq")
private Long id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...