Spring JPA с Postgres - генерация идентификатора сбрасывается с начала - PullRequest
0 голосов
/ 13 января 2019

Я использовал следующий код для сохранения сущности в 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 начал генерировать идентификаторы с самого начала и игнорирует уже существующие записи. Перезапуск не помог, ни использование EntityManager. Приложение отлично работает с новой чистой БД. Любые идеи, как исправить БД, чтобы она генерировала правильный идентификатор?

РЕШИТЬ:

CREATE TABLE tw_event2 AS TABLE tw_event;

Затем я удалил исходную таблицу и переименовал копию в tw_event. После этого следующий идентификатор был последним + 1, как и ожидалось. Не было необходимости менять код. Понятия не имею, что вызвало эту ошибку, хотя

1 Ответ

0 голосов
/ 13 января 2019

Лучше указать стратегию наподобие @GeneratedValue(strategy = GenerationType.IDENTITY), если вы, конечно, не используете последовательность, в противном случае вы бы поставили @GeneratedValue(strategy = GenerationType.SEQUENCE), чтобы убедиться, что стратегия, используемая для генерации идентификаторов, всегда одинакова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...