Есть ли простой способ получить следующий идентификатор объекта, который использует стратегию генерации идентификаторов 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).
Как насчет того, чтобы просто вызвать тот же код, что и Hibernate? Что-то вроде этого:
Integer nextValue = (Integer) session.getSessionFactory()
.unwrap(SessionFactoryImplementor.class)
.getRuntimeMetamodels()
.getMappingMetamodel()
.findEntityDescriptor(MyEntity.class)
.getIdentifierGenerator()
.generate(session, null)
Да, я сделал то же самое, не смог найти лучшего решения, так что это правильный ответ.