JPA @GeneratedValue始终为null

时间:2014-02-25 15:17:54

标签: java jpa

我正在使用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 ].

为什么会这样?提前谢谢!

1 个答案:

答案 0 :(得分:5)

EntityManager.merge()不会修改作为参数传递的对象,也不会对其进行管理。它将作为参数传递的对象的状态复制到托管实体实例,并返回此托管实体实例。因此,如果您想获得托管实体,则需要

poco = em.merge(poco);