带有MySQL的JPA返回错误的最后插入的id

时间:2018-04-27 14:42:49

标签: java mysql jpa java-ee persistence

我正在使用JPA在无状态bean中创建新实体,“hg”表是一个带有自动增量ID列作为主键的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列以这种方式定义:

@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。

我当然已经google了,但我没有任何有用的东西,我正在考虑更改表结构,剥离自动生成的ID并添加计算列,但它涉及一些变化,所以我更喜欢找一种解决这个问题的方法。

编辑:我正在使用glassfish 4.1,JPA提供程序是EclipseLink(JPA 2.1)

0 个答案:

没有答案