我正在编写一个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
这是什么意思?我错过了什么吗?任何帮助/见解都表示赞赏。
答案 0 :(得分:1)
确保将search_path设置为序列所属的架构。即使有问题的表是架构限定的,也必须适当设置search_path。
答案 1 :(得分:0)
这是洞察力。
ERROR: sequence "user_id_seq" does not exist
这意味着您的序列不存在于数据库中或,用户无权访问它。
<强>解决方案:强>
user_id_seq
\ds
答案 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)