Как получить следующий идентификатор для стратегии генерации идентификатора = GenerationType.TABLE

Есть ли простой способ получить следующий идентификатор объекта, который использует стратегию генерации идентификаторов GenerationType.TABLE и пользовательскую таблицу базы данных? Моя проблема в том, что размер выделения не равен 1 (что нормально - оптимизация), но таким образом JPA не обновляет таблицу последовательности при каждом создании объекта. Поэтому мне интересно, есть ли способ перейти к следующей последовательности (мне это нужно для другой операции), и в следующий раз, когда будет создан новый объект, он также должен использовать следующую последовательность. Поэтому идентификатор, который я буду использовать для других целей, будет пропущен при следующем создании нового объекта.

Пример отображения:

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE, generator = "TestIdGenerator")
  @GenericGenerator(
      name = "TestIdGenerator",
      strategy = "enhanced-table",
      parameters = {
          @Parameter(name = "table_name", value = "sequences"),
          @Parameter(name = "segment_column_name", value = "key_column_txt"),
          @Parameter(name = "segment_value", value = "test_id"),
          @Parameter(name = "value_column_name", value = "next_id"),
          @Parameter(name = "increment_size", value = "20"),
          @Parameter(name = "optimizer", value = "pooled-lo")
      }
  )
  @Column(name = "test_id")
  @EqualsAndHashCode.Include
  @ToString.Include
  private Integer id;

Я использую SequenceStyleGenerator (Hibernate 5).

Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как насчет того, чтобы просто вызвать тот же код, что и Hibernate? Что-то вроде этого:

Integer nextValue = (Integer) session.getSessionFactory()
  .unwrap(SessionFactoryImplementor.class)
  .getRuntimeMetamodels()
  .getMappingMetamodel()
  .findEntityDescriptor(MyEntity.class)
  .getIdentifierGenerator()
  .generate(session, null)

Да, я сделал то же самое, не смог найти лучшего решения, так что это правильный ответ.

Dzhenko 02.02.2023 11:13

Другие вопросы по теме