java - 带有 Postgres 的 Spring JPA - 从一开始就重置 ID 生成

标签 java postgresql jpa

我使用以下代码将实体持久化到 Postgres:

@Entity
public class TwEvent {

    @Id
    @GeneratedValue
    private Long id;

    private String type;
}



@Repository
public class TwEventDAO {

   @Autowired
   private TwEventRepo repo;

   public void save(TwEvent twEvent) {
     repo.save(twEvent);
   }
}


public interface TwEventRepo extends JpaRepository<TwEvent,Long>{

}

它为大约 30.000 条记录工作,但当我今天启动我的应用程序时,我收到 SQL 错误:

2019-01-13 19:57:48:432 WARN  http-nio-8081-exec-4 o.h.e.j.s.SqlExceptionHelper:127 - SQL Error: 0, SQLState: 23505
2019-01-13 19:57:48:432 ERROR http-nio-8081-exec-4 o.h.e.j.s.SqlExceptionHelper:129 - ERROR: duplicate key value violates unique constraint "tw_event_pkey"
  Detail: Key (id)=(34) already exists.
2019-01-13 19:57:48:434 INFO  http-nio-8081-exec-4 o.h.e.j.b.i.AbstractBatchImpl:193 - HHH000010: On release of batch it still contained JDBC statements

看起来 Postgres 从一开始就开始生成 ID,并忽略了已经存在的记录。重新启动没有帮助,也没有使用 EntityManager。 应用程序适用于新的干净数据库。关于如何修复数据库以便生成的任何想法 正确的 ID?

已解决:

创建表 tw_event2 作为表 tw_event;

然后我删除了原始表并将副本重命名为 tw_event。之后,下一个 ID 如预期的那样是 last+1。无需更改代码。虽然不知道是什么导致了这个错误

最佳答案

如果您当然不使用序列,最好指定像 @GeneratedValue(strategy = GenerationType.IDENTITY) 这样的策略,否则您将使用 @GeneratedValue(strategy = GenerationType.SEQUENCE) ,以确保用于生成 id 的策略始终相同。

关于java - 带有 Postgres 的 Spring JPA - 从一开始就重置 ID 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54172183/

相关文章:

java - 让 OpenGL-ES 模板缓冲区工作

java - 当我将项目发送给任何人时,如何自动添加外部java库?

postgresql - 在PostgreSQL中使用查询设置列类型

ruby-on-rails - 类型错误 : expected numeric

java - 来自 Hibernate Entity 的 For 循环未按预期返回结果

java - 按钮功能

postgresql - psycopg2:如果内存不足,PostgreSQL 是否会在磁盘上存储表的副本

sql - 在 JPQL 请求中使用新语句

java - LocalContainerEntityManagerFactoryBean 中的 EntityManager 不会将实体保存到数据库中

java - 参数值 [2] 与预期类型不匹配 [com.cityBike.app.model.User