JPA 2 @SequenceGenerator @GeneratedValue, создающий уникальное нарушение ограничения

Обзор проблемы

В случайное время мы получаем исключение: «повторяющийся ключ postgresql нарушает ограничение уникальности». Я думаю, что знаю, в чем заключаются наши проблемы, но я не хочу вносить изменения в код, не имея воспроизводимого контрольного примера. Но так как мы не смогли воспроизвести его ни в какой среде, кроме случайной работы, я прошу помощи у SO.

В этом проекте у нас есть несколько баз данных postgres и последовательность первичных ключей, настроенная для каждой таблицы в каждой базе данных. Эти последовательности создаются так:

create sequence PERSONS_SEQ;
create sequence VISITS_SEQ;
etc...

Мы используем эти последовательности для генерации первичных ключей для сущностей, подобных этой:

@Entity
@Table(name = "visits")
public class Visit {
  @Id
  @Column(name = "id")
  @SequenceGenerator(name = "seq", sequenceName = "visits_seq")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
  private int id;
  ...
}

@Entity
@Table(name = "person")
public class Person {
  @Id
  @Column(name = "id")
  @SequenceGenerator(name = "seq", sequenceName = "persons_seq")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
  private int id;
  ...
}

Анализ

Я думаю, что я узнаю 2 проблемы с этой конфигурацией:

1) Оба @SequenceGenerators задают один и тот же атрибут имени, даже если они должны отображаться в разные последовательности базы данных.

2) Атрибут @SequenceGenerator allocSize по умолчанию равен 50 (мы используем hibernate в качестве поставщика JPA), поэтому я думаю, что синтаксис создания последовательности должен указывать, на сколько последовательность должна увеличиваться, в частности, на 50, чтобы соответствовать allocSize.

Исходя из этого предположения, я думаю, что код должен быть изменен примерно так:

create sequence PERSONS_SEQ increment by 50;
create sequence VISITS_SEQ increment by 50;
etc...

@Entity
@Table(name = "visits")
public class Visit {
  @Id
  @Column(name = "id")
  @SequenceGenerator(name = "visits_seq", sequenceName = "visits_seq")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "visits_seq")
  private int id;
  ...
}

@Entity
@Table(name = "person")
public class Person {
  @Id
  @Column(name = "id")
  @SequenceGenerator(name = "persons_seq", sequenceName = "persons_seq")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "persons_seq")
  private int id;
  ...
}

Я бы просто проверил это, а не задал вопрос о SO, но опять же, мы не смогли воспроизвести эту производственную проблему ни в каких других средах. И даже в производстве уникальное нарушение ограничения происходит только в казалось бы случайные моменты времени.

Вопросов:

1) Прав ли я в своем анализе того, какие изменения должны быть сделаны, чтобы исправить это уникальное нарушение ограничения?

2) Каковы лучшие практики использования генераторов последовательностей при использовании hibernate в качестве поставщика JPA?

Ответы на вопрос(3)

Ваш ответ на вопрос