Обычно при создании таблицы с GenerationType.IDENTITY на postgres Hibernate настраивает столбец идентификатора плюс последовательность базы данных для управления этим идентификатором.
По договоренности имя последовательности будет " tablename _id_seq". Например, для таблицы ad_group_action
будет соответствующая последовательность ad_group_action_id_seq
. Вы можете подключиться к базе данных, чтобы дважды проверить фактическое имя созданной последовательности.
Последовательность начинается с 1 и увеличивается каждый раз, когда Hibernate вставляет строку.
Но если есть уже существующие строки - или если строки с существующими идентификаторами вставляются "вручную" в таблицу - эти строки могут конфликтовать с последовательностью.
Одним из решений является просто сброс последовательности (из pgAdmin или другого клиента базы данных), чтобы она начиналась с большего числа (скажем, 100), используя что-то вроде:
ALTER SEQUENCE ad_group_action_id_seq RESTART WITH 100;
Теперь Hibernate не будет конфликтовать с существующими строками (при условии, что их максимальный идентификатор <100). </p>
В качестве альтернативы, при вставке строк вручную, опустите столбец id и позвольте postgres автоматически установить их. Таким образом, таблица и последовательность всегда будут синхронизированы.