当它发生时序列不存在 - Postgres / Spring Boot

时间:2017-07-07 05:09:33

标签: postgresql hibernate spring-data database-sequence

我正在编写一个Spring Boot网络应用程序并使用Postgres数据库来保存我的数据。我使用create table user (id bigserial primary key not null, name text not null;在Postgres中创建了一个表,并通过查看模式(在这种情况下,它是sequence_name)来标识其user_id_seq。然后,在Spring Boot的User实体类中,我添加了以下内容:

@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

这是什么意思?我错过了什么吗?任何帮助/见解都表示赞赏。

4 个答案:

答案 0 :(得分:1)

确保将search_path设置为序列所属的架构。即使有问题的表是架构限定的,也必须适当设置search_path。

答案 1 :(得分:0)

这是洞察力。

ERROR: sequence "user_id_seq" does not exist

这意味着您的序列不存在于数据库中,用户无权访问它。

<强>解决方案:

  1. 按命令user_id_seq
  2. 检查数据库中的\ds
  3. 按顺序授予特定用户访问权限 在SCHEMA架构名称中删除所有序列到用户名;

答案 2 :(得分:0)

在春季启动中抽象出的后端进行猜测,但是在使用可能有用的postgresql 9.6时,我发现了类似的问题,但有相同的错误。重建我的表后(DROP,然后使用相同的序列名创建),has_sequence_privilege(name,text,text)可能无法识别序列的 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'

没有。

答案 3 :(得分:0)

将特定于数据库的转义字符(在postgres中为“”)放在序列名称的周围。

序列名称已由驱动程序更改。有时会发生这种情况,因为驱动程序认为db-server不区分大小写,但db-server区分大小写。

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TEACHER")
  @SequenceGenerator(name = "TEACHER",  sequenceName = "\"Teahcer_pkey\"")
  @Column(name = "id", nullable = false)