JPA с MySQL возвращает неверный последний вставленный идентификатор - PullRequest
0 голосов
/ 27 апреля 2018

Я использую JPA для создания новой сущности в bean-компоненте без состояния, таблица "hg" - это MySQL InnoDB со столбцом идентификатора автоинкремента в качестве первичного ключа:

[...]
// if we haven't an ID, it's a new hg
if (hg.getIdHg() == null) {
  hg.setDate(new Date());
  hg.setIdCli(cli);
}
// fill fields
hg.setIdOp(op);
[...]
hg.setText(text);
// add hg to cli
if (!cli.getHgCollection().contains(hg)) {
  Cli.getHgCollection().add(hg);
}
//
jpa.persist(hg);
jpa.flush();
//
LOG.info("*** hg stored with id " + hg.getIdHg());
[...]

В столбце Идентификатор сущности Hg определяется следующим образом:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id_hg")
private Integer idHg;

Это почти работает, но за 3 года у меня было 6 случаев, когда hg.getIdHg () неверен, то есть: вставленная запись имеет идентификатор 2809643, но hg.getIdHg () возвращает 2809638!

Ничего нет между persist, flush и строкой LOG, нет странного кода до или после, поэтому я не понимаю, почему я получаю более старый идентификатор.

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

РЕДАКТИРОВАТЬ: я использую Glassfish 4.1, JPA-провайдер EclipseLink (JPA 2.1)

...