Последовательность не существует, когда она существует - 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

Это означает, что ваша последовательность либо не существует в базе данных, либо у пользователя нет прав доступа к ней.

Решение:

  1. Проверьте user_id_seq в базе данных по команде \ds
  2. Предоставить доступ по последовательности конкретному пользователю.
    ПРЕДОСТАВЛЯТЬ ВСЕ НА ВСЕХ ПОСЛЕДОВАТЕЛЬНОСТЯХ В СХЕМЕ имя_схемы

Убедитесь, что ваш 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 {
Другие вопросы по тегам