2014-02-17 49 views
0

我試圖保存到數據庫對分離實體所做的更改。 實體的對象傳遞給通過參數的函數(命名爲數據):JPA不堅持實體

private boolean generate(CommonGameData data) { 
     boolean result = true; 
     EntityManager em = HibernateUtil.currentEntityManager(); 
     try { 
      em.getTransaction().begin(); 

      em.merge(data); 
      em.flush(); 
      ...some changes to data object... 
      em.persist(data); 
      em.flush(); 
      em.getTransaction().commit(); 

    } catch (Exception ex) { 
     ... 
     return false; 
    } 
     return true; 
} 

至於我,如果我使用分離的實體已閱讀,我應該先打電話合併。 但提交成功完成後,我看不到數據庫中的任何更改。 錯誤在哪裏?

+0

也許與http://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge?有關? – Smutje

+0

你想做什麼:保存一個新的實體或更新它?向我們展示HibernateUtil。 –

+0

我沒有得到這段代碼。當您想要從已分離的現有持久對象合併更改時調用合併。當你想將新創建的實體持久化到數據庫時,你可以調用persist。 – Gimby

回答

1

由於您不保存新的實體(來自您的評論),因此您不需要致電persist()。 我也沒有看到任何理由在致電merge()之後做出「一些更改」,所以在進行這些更改後我打電話給merge()

所以,請嘗試以下操作:

em.getTransaction().begin(); 

    ...some changes to data object... 
    em.merge(data); 
    em.flush(); 

    em.getTransaction().commit(); 

也很重要:如果您重複使用的一個ThreadLocal變量EntityManager,你應該照顧之類的東西失敗了過去的交易(至少清楚它可能超近距離它)。如果錯誤仍然存​​在,請嘗試重新創建一個entityManager。