Search code examples
jpajpa-2.0eclipselink

eclipselink merge() without initial SELECT


I am trying to perform a merge(entity) using eclipselink, and I would like to indicate to eclipse if that will be an update or insert, so it does not have to perform the initial select query. Thanks to the progress made in this question, I have the following:

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

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

However, i get the following:

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

Am I approaching this the correct way? If so, how can I correct the error?

Thanks


Solution

  • Thanks to the author of the answer here, the working solution is as follows, keeping track myself of what has gone into the DB, where 'em' is the eclipselink entity manager:

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