2014-02-25 49 views
0

我正在使用MySQL/JPA,並且持久化實體上的自動生成的ID即使在提交後也不可用。下面是它發生在哪裏代碼:JPA @GeneratedValue is allways

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

你可以顯示你的實體嗎? –

+1

PS:我認爲這是因爲你正在使用'merge()' - >嘗試'persist()' –

回答

5

EntityManager.merge()不會修改作爲參數傳遞的對象,並且不會使其進行管理。它將作爲參數傳遞的對象的狀態複製到託管實體實例,並返回此託管實體實例。所以如果你想獲得託管實體,你需要

poco = em.merge(poco); 
+0

它似乎也可能是OP試圖「合併」新的實例。 – chrylis

+0

謝謝@JB Nizet解決了我的問題。 – BrunoPires

相關問題