@GeneratedValue(strategy=GenerationType.TABLE)
указывает провайдеру JPA использовать таблицу для получения идентификаторов при вставке вновь созданных объектов в базу данных.
При использовании Hibernate в качестве поставщика это приведет к таблице hibernate_sequences
, которая имеет два столбца: имя объекта и максимальный идентификатор, уже назначенный этому объекту. Здесь, похоже, Hibernate не удалось получить следующий идентификатор для вашей сущности, но трудно сказать точно, почему, потому что вы не предоставили достаточно информации для этого.
Итак, не могли бы вы предоставить полную трассировку стека? Также, пожалуйста, включите ведение журнала со свойством hibernate.show_sql
, установленным на true
, и установите правильный уровень ведения журнала log4j.logger.org.hibernate.SQL=DEBUG
. Если возможно, присоедините журнал к своему вопросу.
Может быть, просто проверьте, что вы правильно настроили hibernate.dialect
для Oracle. На самом деле, если возможно, присоединитесь к своей конфигурации гибернации.
PS: «Традиционный» способ генерации PK с Oracle - это использовать последовательности (вы можете позволить Hibernate угадать лучшую стратегию для вашего типа базы данных, используя GenerationType.AUTO
, или принудительно использовать SEQUENCE
), но я предполагаю, что вы хотите, чтобы результирующая структура данных была независимой от базы данных. Если нет, я бы посоветовал перейти к последовательностям.
РЕДАКТИРОВАТЬ: Ответ на комментарий от ОП о GenerationType.AUTO
. Действительно, по умолчанию используется единственная глобальная последовательность с именем hibernate_sequence
, и это может быть проблемой. Но с настройкой, показанной ниже, вы можете использовать GenerationType.AUTO
и по-прежнему контролировать имя последовательности для случаев, когда база данных использует последовательности:
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private long id;
Другими словами, вы можете использовать разные имена последовательностей для каждой таблицы без потери переносимости.