我正在编写一个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
这是什么意思?我是不是遗漏了什么?如有任何帮助/见解,我们将不胜感激。
5条答案
按热度按时间yhived7q1#
以下是我的见解。
这意味着数据库中不存在您的序列或者用户无权访问它。
解决方案:
1.通过命令
\ds
查看数据库中的user_id_seq
1.授予特定用户对Sequence的访问权限。
将SCHEMA_NAME中的所有序列的ALL授予USER_NAME;
zpf6vheq2#
将特定于数据库的转义字符(在postgres中)放在序列名的名称周围。
序列的名称已被驱动程序更改。有时会发生这种情况,因为驱动程序认为数据库服务器不区分大小写,但数据库服务器区分大小写。
wmomyfyw3#
确保将SEARCH_PATH设置为序列所属的模式。即使有问题的表是模式限定的,也必须适当设置SEARCH_PATH。
uyto3xhc4#
我猜测后端被Spring Boot抽象化了,但我在使用PostgreSQL9.6时发现了一个类似的问题,同样的错误可能会有用。当我的表被重新构建(删除,然后使用相同的序列名称创建)时,HAS_SEQUENCE_PRIVIZATION(名称、文本、文本)可能无法识别序列的PG_Class.relname。
使用pg_class.id为我解决了这个问题。
要澄清以下问题:
为重新生成的表引发错误,而
不会的。
t98cgbkg5#
在Postgres 14.5和Spring Boot 2.7.3中也遇到了类似的问题,对我来说,解决方案是将表名从“User”更改为“Users”,如下所示: