java - 带有 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)
解决方案
推荐阅读
- python - 如何提高这个简单的数据清洗代码的运行时间?
- powerbi-desktop - 状态码:416,描述:“指定的范围对于资源的当前大小无效。”
- linux - 无法获取简单的 bash 脚本
- java - Null pointer exception using gson to parse json
- java - 如何在 Windows 中使用“任务列表”获取进程的 CPU 使用率
- google-api - 使用服务帐户的 Gmail API 收到委派被拒绝错误消息
- sql - 我有两个使用 UNION 组合的选择查询。我在一列中得到两个结果我怎样才能在两列中得到它
- docx4j - 使用 Emulator.getNumber() 时如何修复“abstractListDefinition 0 缺少 0 级”错误
- objective-c - NSMenuitem 模板图像色调颜色不变
- python - 运行脚本时使用多处理