6

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

@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与我之前看到的相符。现在,当我启动我的 spring boot 应用程序时,我能够成功启动它,但我在跟踪中得到以下“错误”:

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

4 回答 4

2

Here is insight.

ERROR: sequence "user_id_seq" does not exist

It mean your sequence either not exist in database OR the user doesn't has permission to access it.

Solution:

  1. Check user_id_seq in database by command \ds
  2. Grant access on sequence to specific user.
    GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO user_name;
于 2017-07-07T05:23:52.577 回答
1

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

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

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TEACHER")
  @SequenceGenerator(name = "TEACHER",  sequenceName = "\"Teahcer_pkey\"")
  @Column(name = "id", nullable = false)
于 2018-11-22T05:26:10.917 回答
1

确保您的 search_path 设置为序列所属的模式。即使有问题的表是模式限定的,也必须适当地设置 search_path。

于 2019-05-10T20:51:59.767 回答
0

猜测由spring boot抽象出来的后端,但我在使用可能有用的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'

才不是。

于 2018-09-08T01:34:37.660 回答