我正在使用MySQL / JPA,即使在提交后,持久化实体上的自动生成的ID也不可用。这是代码发生的地方:
synchronized (em.getTransaction()) {
while (em.getTransaction().isActive()) {
em.getTransaction().wait();
}
em.getTransaction().begin();
try {
em.merge(transmissor);
em.merge(poco);
em.flush();
//em.refresh(poco);
System.out.println("ID: " + poco.getIdEstacao());
} catch (Exception ex) {
System.out.println(ex.toString());
ex.printStackTrace();
}
// Some other unrelated code...
em.getTransaction.commit();
em.getTransaction.notify();
System.out.println("ID: " + poco.getIdEstacao());
}
在em.flush()
之后和em.getTransaction.commit()
之后,poco.getIdEstacao
都会返回null
。如果我尝试em.refresh(poco)
它会引发异常:
java.lang.IllegalArgumentException: Can not refresh not managed object:unesp.lebac.aquitel.dataLink.enitity.Poco[ idEstacao=null ].
为什么会这样?提前谢谢!
答案 0 :(得分:5)
EntityManager.merge()
不会修改作为参数传递的对象,也不会对其进行管理。它将作为参数传递的对象的状态复制到托管实体实例,并返回此托管实体实例。因此,如果您想获得托管实体,则需要
poco = em.merge(poco);