hibernate 序列不存在-Postgres/Spring Boot

vlju58qv  于 2022-11-14  发布在  Spring
关注(0)|答案(5)|浏览(274)

我正在编写一个Spring Boot Web应用程序,并使用postgres数据库来持久化我的数据。我使用create table user (id bigserial primary key not null, name text not null;在postgres中创建了一个表,并通过查看模式(在本例中为user_id_seq)标识了它的sequence_name。然后,在我的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与我之前看到的匹配。现在,当我启动我的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

这是什么意思?我是不是遗漏了什么?如有任何帮助/见解,我们将不胜感激。

yhived7q

yhived7q1#

以下是我的见解。

ERROR: sequence "user_id_seq" does not exist

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

解决方案:

1.通过命令\ds查看数据库中的user_id_seq
1.授予特定用户对Sequence的访问权限。

将SCHEMA_NAME中的所有序列的ALL授予USER_NAME;

zpf6vheq

zpf6vheq2#

将特定于数据库的转义字符(在postgres中)放在序列名的名称周围。
序列的名称已被驱动程序更改。有时会发生这种情况,因为驱动程序认为数据库服务器不区分大小写,但数据库服务器区分大小写。

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

wmomyfyw3#

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

uyto3xhc

uyto3xhc4#

我猜测后端被Spring Boot抽象化了,但我在使用PostgreSQL9.6时发现了一个类似的问题,同样的错误可能会有用。当我的表被重新构建(删除,然后使用相同的序列名称创建)时,HAS_SEQUENCE_PRIVIZATION(名称、文本、文本)可能无法识别序列的PG_Class.relname
使用pg_class.id为我解决了这个问题。
要澄清以下问题:

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'

不会的。

t98cgbkg

t98cgbkg5#

在Postgres 14.5和Spring Boot 2.7.3中也遇到了类似的问题,对我来说,解决方案是将表名从“User”更改为“Users”,如下所示:

@Entity
@Table(name = "users")
public class User {

相关问题