Итак, наш проект использует базу данных PostgreSQL, и мы используем JPA для работы с базой данных. Мы создали объекты из базы данных с автоматическим созданием в Netbeans 7.1.2.
После небольших изменений наши значения первичного ключа описываются как:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@Column(name = "idwebuser", nullable = false)
private Integer idwebuser;
Проблема в том, что теперь приложение не является гибким, потому что, когда мы изменяем базу данных напрямую (используя SQL или другой инструмент) вместо того, чтобы идти через приложение Java, сгенерированное значение ниже, чем фактическое значение идентификатора базы данных, и поэтому мы получаем ошибку во время создание новых сущностей.
Есть ли вероятность того, что JPA может просто позволить базе данных автоматически сгенерировать идентификатор, а затем получить его после процесса создания? Или что может быть лучшим решением? Спасибо.
EDIT Более конкретно: у нас есть таблица пользователей, и моя проблема заключается в том, что при использовании любого типа типа генерации стратегии JPA вставляет новый объект с указанным идентификатором генератора. Что для меня неправильно, т.к. если я вношу изменения в таблицу самостоятельно, добавляя новые записи, то GeneratedValue для приложения будет ниже текущего ID - что приводит нас к исключению с дублирующимся ID. Можем ли мы это исправить ;)?
короткое примечание к ответу С моей стороны было немного лжи, потому что мы использовали PG Admin -> View first 100 Rows и редактировали строки оттуда вместо использования select. В ЛЮБОМ СЛУЧАЕ получается, что этот редактор каким-то образом пропускает процесс обновления идентификатора, и поэтому даже в БД, когда мы пишем правильный INSERT, он ВЫПОЛНЯЕТСЯ с неправильным идентификатором! Так что в основном это была проблема редактора, который мы использовали, а не базы данных и приложения...
теперь это работает даже с использованием @GeneratedValue(strategy=GenerationType.IDENTITY)
serial
или просто целое число? - person a_horse_with_no_name   schedule 06.08.2012@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq") @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
И мы только что получили ошибкуException [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "webuser_idwebuser_pk" Detail: Key (idwebuser)=(14) already exists.
Так что, похоже, что-то все еще не так. - person Atais   schedule 06.08.2012INSERT (xx,xxx) INTO WEBUSER
(просто пример); Я не указываю никакого Генератора. Значит ли это, что я не могу работать с самой базой данных, когда она используется приложением? - person Atais   schedule 06.08.2012