首页 > 解决方案 > 带有 MySQL 的 JPA 返回错误的最后插入 id

问题描述

我正在使用 JPA 在无状态 bean 中创建一个新实体,“hg”表是一个 MySQL InnoDB,其自动增量 ID 列作为主键:

[...]
// 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 entity id 列中是这样定义的:

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

它几乎可以工作,但在 3 年中,我遇到了 6 次 hg.getIdHg() 错误的情况,即:插入的记录的 id 为 2809643 但 hg.getIdHg() 返回 2809638!

在persist,flush和LOG行之间没有任何东西,之前或之后没有奇怪的代码,所以我不明白为什么我会得到一个旧的ID。

我当然用谷歌搜索过,但没有发现任何有用的东西,我正在考虑更改表结构,剥离自动生成的 ID 并添加计算列,但它涉及大量更改,所以我更喜欢找到一种方法解决这个问题。

编辑:我使用 glassfish 4.1,JPA 提供者是 EclipseLink (JPA 2.1)

标签: javamysqljpajakarta-eepersistence

解决方案


推荐阅读