2013-02-19 124 views
0

我試圖用EclipseLink管理我的數據庫,並且出現嚴重問題。在數據庫中插入值或更新現有數據

這裏是我的簡單的方法

PUEntityManager.getTransaction().begin(); 
    if (!PUEntityManager.contains(evento)) { 
     PUEntityManager.persist(evento);    
    } else { 
     PUEntityManager.merge(evento); 
     //PUEntityManager.refresh(evento); 
    } 
    PUEntityManager.getTransaction().commit(); 

正如你可以看到它真的很容易。 如果數據庫包含實體,我會合並更改以將它們存儲在數據庫中,否則我只是創建一個新的實體。

但它不起作用,因爲它會拋出一個關於重複主鍵的異常,即使該包含返回true!

它有什麼問題?

+0

對象evento來自哪裏?它是來自一個EntityManager還是它創建在預置環境之外? – esej 2013-02-19 11:46:49

+0

它是在PersitenceContext之外創建的,爲什麼? – StepTNT 2013-02-19 11:49:27

回答

0

如果將實體放入Eclipselink之外的數據庫中,那麼您需要先嚐試加載該實體,然後再堅持對其進行更改。這是確保一致性的唯一可靠方法:

Object primaryKey = evento.getPrimaryKey(); 
Object tmpEvento = PUEntityManager.load(Evento.class, primaryKey) 

if (tmpEvento == null) 
{ 
    tmpEvento = PUEntityManager.persist(evento); 
} 
else 
{ 
    // If the evento already exists, you need to decide which attributes of 
    // the evento in the DB that you want to copy over to the evento 
    // you want to merge. This is only an example. 
    tmpEvento.setXXX(evento.getXXX()); 
    tmpEvento.setYYY(evento.getYYY()); 
    tmpEvento = PUEntityManager.merge(tmpEvento); 
} 

// I recommend returning the tmpEvento object after persisting or merging. 
return tmpEvento; 
相關問題