JPA - проблема с атрибутом PK после INSERT - PullRequest
0 голосов
/ 25 марта 2020

JPA (провайдер гибернации) и Postgres 11

У меня есть эта конфигурация для моего свойства Id (это один столбец / атрибут PK).

По какой-то причине после выполнения INSERT в эту таблицу JPA вызывает

select currval('yb.asset_store_id_seq')

Я полагаю (я не уверен), что делает это, чтобы обновить sh Идентификатор недавно вставленной сущности или, может быть, по какой-то аналогичной причине

Но такой последовательности нет. Моя последовательность называется yb.asset_store_seq, а моя таблица - yb.asset_store. Мой класс сущности AssetStore.

Итак ... как мне избавиться от этой проблемы? В основном JPA каким-то образом создает это имя последовательности из ниоткуда . Или я что-то упустил?!

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable=false, updatable=false)
private Integer id;

На уровне БД последовательность принадлежит таблице.

Вот трассировка стека.

    Hibernate: 
        select
            currval('yb.asset_store_id_seq')
    Mar 25, 2020 3:45:02 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
    WARN: SQL Error: 0, SQLState: 42P01
    Mar 25, 2020 3:45:02 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
    ERROR: ERROR: relation "yb.asset_store_id_seq" does not exist
      Position: 16
    Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet


    ...................


        Caused by: org.postgresql.util.PSQLException: ERROR: relation "yb.asset_store_id_seq" does not exist
  Position: 16
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)

1 Ответ

1 голос
/ 25 марта 2020

Прежде всего, документация на спящий режим вообще не предлагает использовать стратегию GenerationType.IDENTITY:

Важно понимать, что использование столбцов IDENTITY навязывает поведение во время выполнения, когда строка объекта должна быть физически вставлена ​​до того, как будет известно значение идентификатора.

Это может испортить расширенные контексты персистентности (длинные разговоры). Из-за наложения / несогласованности во время выполнения Hibernate предлагает использовать другие формы генерации значений идентификаторов (например, SEQUENCE).

Существует еще одно важное влияние во время выбора генерации IDENTITY: Hibernate не сможет пакетировать операторы INSERT. для сущностей, использующих генерацию IDENTITY.

Но если вы не можете изменить его, вы используете драйвер JDBC3 + и JRE1.4 +. Я бы предложил явно определить:

<property name="hibernate.jdbc.use_get_generated_keys">true</property>

Потому что согласно это

hibernate.jdb c .use_get_generated_keys ( например, истина или ложь)

Позволяет Hibernate использовать JDBC3 PreparedStatement.getGeneratedKeys () для извлечения собственных ключей после вставки. Вам нужен драйвер JDBC3 + и JRE1.4 +. Отключите это свойство, если у вашего драйвера проблемы с генераторами идентификаторов Hibernate. По умолчанию он пытается определить возможности драйвера по метаданным подключения.

Это позволит избежать вашей проблемы.

...