eclipselink merge()没有初始SELECT

时间:2013-11-15 01:30:09

标签: jpa jpa-2.0 eclipselink

我正在尝试使用eclipselink执行merge(entity),并且我想指示eclipse是否是更新或插入,因此它不必执行初始选择查询。感谢this question取得的进展,我有以下内容:

UnitOfWorkImpl uow = (UnitOfWorkImpl) ((EntityManagerImpl) em.getDelegate()).getUnitOfWork();

if (dbObj.isInDB())
{
    uow.updateObject(dbObj);
}
else
{
    uow.insertObject(dbObj);
}

UnitOfWorkImpl uow = (UnitOfWorkImpl) ((EntityManagerImpl) em.getDelegate()).getUnitOfWork(); if (dbObj.isInDB()) { uow.updateObject(dbObj); } else { uow.insertObject(dbObj); }

但是,我得到以下内容:

org.eclipse.persistence.exceptions.QueryException: Exception Description: Objects cannot be written during a UnitOfWork, they must be registered. Query: UpdateObjectQuery

我接近这个正确的方法吗?如果是这样,我该如何纠正错误?

由于

1 个答案:

答案 0 :(得分:5)

感谢答案here的作者,工作解决方案如下,跟踪自己进入数据库的内容,其中'em'是eclipselink实体管理器:

AbstractSession session = ((EntityManagerImpl) em.getDelegate()).getUnitOfWork().getParent();
if (dbObj.getLastModifiedTime().isAfter(lastUpdated))
{
    if (dbObj.isInDB())
    {
        session.updateObject(dbObj);
    }
    else
    {
        session.insertObject(dbObj);
    }
}

AbstractSession session = ((EntityManagerImpl) em.getDelegate()).getUnitOfWork().getParent(); if (dbObj.getLastModifiedTime().isAfter(lastUpdated)) { if (dbObj.isInDB()) { session.updateObject(dbObj); } else { session.insertObject(dbObj); } }