我正在使用以下代码将实体持久保存到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。无需更改代码。不知道是什么导致了这个错误
答案 0 :(得分:1)
如果您当然不使用序列,最好指定类似@GeneratedValue(strategy = GenerationType.IDENTITY)
的策略,否则应放置@GeneratedValue(strategy = GenerationType.SEQUENCE)
,以确保用于生成ID的策略始终相同。< / p>