2013-02-19 93 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; 
相关问题