Последовательность не существует, когда она существует - Postgres/Spring Boot
Я пишу веб-приложение Spring Boot и использую базу данных Postgres для сохранения моих данных. Я создал таблицу в Postgres, используя create table user (id bigserial primary key not null, name text not null;
и определили его sequence_name
глядя на схему (в данном случае это user_id_seq
). Тогда по моему User
В сущности класса в Spring Boot я добавил следующее:
@Entity
@Table(name = "user")
public class User implements Serializable {
@Id
@SequenceGenerator(name = "user_local_seq", sequenceName = "user_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_local_seq")
private Long id;
...
убедившись, что sequenceName
соответствует тому, что я видел ранее. Теперь, когда я запускаю свое весеннее загрузочное приложение, я могу успешно загрузить его, но я получаю следующую "ошибку" в трассировке:
main] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: sequence "user_id_seq" does not exist
Я убил приложение и запустил его снова, и на этот раз я получил:
main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000389: Unsuccessful: drop sequence user_id_seq
main] org.hibernate.tool.hbm2ddl.SchemaExport : ERROR: sequence "user_id_seq" does not exist
Что это значит? Я что-то пропустил? Любая помощь / понимание приветствуется.
5 ответов
Положите специфичные для базы данных escape-символы ( "в postgres) вокруг имени имени последовательности.
Название последовательности было изменено драйвером. Иногда это происходит потому, что драйвер думает, что db-сервер нечувствителен к регистру, а db-сервер чувствителен к регистру.
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TEACHER")
@SequenceGenerator(name = "TEACHER", sequenceName = "\"Teahcer_pkey\"")
@Column(name = "id", nullable = false)
Вот понимание.
ERROR: sequence "user_id_seq" does not exist
Это означает, что ваша последовательность либо не существует в базе данных, либо у пользователя нет прав доступа к ней.
Решение:
- Проверьте
user_id_seq
в базе данных по команде\ds
- Предоставить доступ по последовательности конкретному пользователю.
ПРЕДОСТАВЛЯТЬ ВСЕ НА ВСЕХ ПОСЛЕДОВАТЕЛЬНОСТЯХ В СХЕМЕ имя_схемы
Убедитесь, что ваш search_path установлен на схему, которой принадлежит последовательность. Даже если рассматриваемая таблица соответствует схеме, search_path также должен быть установлен соответствующим образом.
Догадываясь о бэкэнде, который абстрагируется от весенней загрузки, я обнаружил похожую проблему с той же ошибкой при использовании postgresql 9.6, которая может оказаться полезной. Когда моя таблица была перестроена (DROP, а затем CREATE с тем же именем последовательности), has_sequence_privilege (имя, текст, текст) может не распознать pg_class.relname последовательности.
Использование pg_class.oid решило это для меня.
Чтобы уточнить:
SELECT has_sequence_privilege('my_role_name',c.relname,'USAGE')
FROM pg_namespace n
JOIN pg_class c
ON c.relnamespace = n.oid
WHERE c.relnamespace = n.oid AND c.relkind = 'S'::"char"
AND n.nspname = 'my_schema_name'
выдает ошибку для перестроенных таблиц, в то время как
SELECT has_sequence_privilege('my_role_name',c.oid,'USAGE')
FROM pg_namespace n
JOIN pg_class c
ON c.relnamespace = n.oid
WHERE c.relnamespace = n.oid AND c.relkind = 'S'::"char"
AND n.nspname = 'my_schema_name'
не.
Была похожая проблема с Postgres 14.5 и Spring Boot 2.7.3, для меня решение состояло в том, чтобы изменить имя таблицы с «user» на «users», например:
@Entity
@Table(name = "users")
public class User {