James,
Please find the code for updates as well as deletes.
public static boolean cacheInvalidate(String entityName, String entityId)
throws Exception {
Class baseTableName = Class.forName(entityName);
Session session = getSession();
UnitOfWork uow = session.acquireUnitOfWork();
Object objectTobeRefreshed = null;
Object objectBackup = null;
Vector primaryKeysList = new Vector();
primaryKeysList.add(entityId);
if (session.containsObjectInIdentityMap(primaryKeysList, baseTableName)) {
objectTobeRefreshed = session.getFromIdentityMap(primaryKeysList,
baseTableName);
}else{
objectTobeRefreshed = findByIdByCacheRefresh(baseTableName,
getPrimaryKey(session, entityName), entityId);
}
if(objectTobeRefreshed==null) return false;
Descriptor descriptor = getDescriptor(session, entityName);
objectBackup = descriptor.getObjectBuilder().instantiateClone(
objectTobeRefreshed,
(oracle.toplink.publicinterface.Session) uow);
objectTobeRefreshed = findByIdByCacheRefresh(baseTableName,
getPrimaryKey(session, entityName), entityId);
UnitOfWorkChangeSet changeSet = new UnitOfWorkChangeSet();
ObjectChangeSet objectChangeSet = null;
if(objectTobeRefreshed==null){//for delete
objectChangeSet = descriptor.getObjectBuilder().createObjectChangeSet(objectBackup, changeSet, false, (oracle.toplink.publicinterface.Session) uow);
changeSet.getDeletedObjects().put(objectChangeSet, objectChangeSet);
}else{//for updates
objectChangeSet = descriptor.getObjectBuilder()
.compareForChange(objectTobeRefreshed, objectBackup, changeSet,
(oracle.toplink.publicinterface.Session) uow);
changeSet.addObjectChangeSet(objectChangeSet, objectTobeRefreshed);
}
if(!changeSet.hasChanges()) return false;
Session severSession = getServerSession();
severSession.getCacheSynchronizationManager().propagateChanges(
changeSet);
return true;
}
--------------------------------------------------------------------------------------------------------------------------
Interesting one is i tried deleting the object from front end UI using following code then also object not removed from not only same session but other applications too. As i mentioned earlier we are using softweakidentitymap for our cache.
public static boolean cacheDeleteObject(String entityName, String entityId)
throws Exception {
Session session = getSession();
UnitOfWork uow = session.acquireUnitOfWork();
Class baseTableName = Class.forName(entityName);
Object objectTobeRefreshed = findByIdByCacheRefresh(baseTableName,
getPrimaryKey(session, entityName), entityId);
if(objectTobeRefreshed==null) return false;
uow.deleteObject(objectTobeRefreshed);
try {
uow.commit();
}
catch(TopLinkException te) {
throw new ResourceException("Exception in cacheDelete()");
}
return true;
}