嗨,伙计们,我有以下问题:
我有一个用Spring编写并使用PostgreSQL的后端服务器。起初,一切都很好,但现在我的朋友创建了一个SQL脚本,用于用测试数据填充数据库。我们开始吧:
19:46:30,253 INFO [stdout] (default task-6) Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "user_pkey"
19:46:30,254 INFO [stdout] (default task-6) Detail: Key (id)=(1) already exists.
19:46:30,254 INFO [stdout] (default task-6) at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2497)
19:46:30,254 INFO [stdout] (default task-6) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2233)
19:46:30,254 INFO [stdout] (default task-6) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:310)
19:46:30,254 INFO [stdout] (default task-6) at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:446)
19:46:30,254 INFO [stdout] (default task-6) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:370)
19:46:30,255 INFO [stdout] (default task-6) at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:149)
19:46:30,255 INFO [stdout] (default task-6) at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:124)
19:46:30,255 INFO [stdout] (default task-6) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
19:46:30,256 INFO [stdout] (default task-6) ... 158 more在该脚本中,我们还为用户提供了一些测试数据。这个错误是在尝试注册时抛出的。我明白,这个错误说明我不能用现有的id将用户保存到数据库中。但我实际上并没有为用户设置id。当我将user发送给save()方法user id = null时,我相信Hibernate应该查看数据库或user_id_sequence,并为当前保存的用户选择最后一个id + 1。至少它是这样工作的,直到我们用测试数据填充了我们的数据库。问题是,为什么Hibernate不选择(最后一个id + 1),而是尝试用现有的id = 0保存一个新用户?有没有办法解决这个问题?
Id生成策略:
@Getter
@Setter
@MappedSuperclass
@EqualsAndHashCode
@NoArgsConstructor
@ToString(exclude = {"deleted", "updated"})
public class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
}Hibernate配置:
datasource.url=**********
datasource.username=**********
datasource.password=**********
datasource.driver=org.postgresql.Driver
hibernate.show_sql=false
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.batch.size=200
hibernate.hbm2ddl.auto=updateSql脚本看起来像一个简单的脚本,用于向数据库填充测试数据:
INSERT INTO public.country (id, created, deleted, updated, code, name, telephone_prefix, continent_id) VALUES (101, NULL, false, NULL, 'ISR', 'Israel', 972, NULL);
....发布于 2021-08-07 20:43:32
您是否为系统初始数据脚本指定了ID?如果这样做,并且它们是正数,您可以尝试将ID更改为负数。如果不指定ID,可以尝试指定ID并将其设为负数
https://stackoverflow.com/questions/68695269
复制相似问题