我正在尝试使用EclipseLink管理我的数据库,但我遇到了一个严重的问题。
这是我的简单方法
PUEntityManager.getTransaction().begin();
if (!PUEntityManager.contains(evento)) {
PUEntityManager.persist(evento);
} else {
PUEntityManager.merge(evento);
//PUEntityManager.refresh(evento);
}
PUEntityManager.getTransaction().commit();
你可以看到它真的很容易。 如果数据库包含实体,我将合并更改以将它们存储在数据库中,否则我只是创建一个新实体。
但是它不起作用,因为它会抛出关于重复主键的异常,即使contains返回true!
它出了什么问题?
答案 0 :(得分: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;