/** * INTERNAL: * This method should ONLY be used to set the initial writeLock value for * an ObjectChangeSet when it is first built. * @param newWriteLockValue java.lang.Object */ public void setOptimisticLockingPolicyAndInitialWriteLockValue(OptimisticLockingPolicy optimisticLockingPolicy, AbstractSession session) { this.optimisticLockingPolicy = optimisticLockingPolicy; this.initialWriteLockValue = optimisticLockingPolicy.getWriteLockValue(cloneObject, getPrimaryKeys(), session); }
/** * Remove object represent this change set from identity map. If change set is in XML format, rebuild pk to the correct class type from String */ protected void removeFromIdentityMap(AbstractSession session) { session.getIdentityMapAccessor().removeFromIdentityMap(getPrimaryKeys(), getClassType(session)); }
Object originalWriteLockValue = optimisticLockingPolicy.getWriteLockValue(original, getPrimaryKeys(), session);
/** * INTERNAL: * Create ObjectChangeSet */ public ObjectChangeSet createObjectChangeSetThroughComparison(Object clone, Object backUp, oracle.toplink.essentials.internal.sessions.UnitOfWorkChangeSet changeSet, boolean isNew, AbstractSession session, ClassDescriptor descriptor) { ObjectBuilder builder = descriptor.getObjectBuilder(); ObjectChangeSet changes = builder.createObjectChangeSet(clone, changeSet, isNew, session); // The following code deals with reads that force changes to the flag associated with optimistic locking. if ((descriptor.usesOptimisticLocking()) && (changes.getPrimaryKeys() != null)) { changes.setOptimisticLockingPolicyAndInitialWriteLockValue(descriptor.getOptimisticLockingPolicy(), session); } // PERF: Avoid synchronized enumerator as is concurrency bottleneck. Vector mappings = descriptor.getMappings(); int mappingsSize = mappings.size(); for (int index = 0; index < mappingsSize; index++) { DatabaseMapping mapping = (DatabaseMapping)mappings.get(index); changes.addChange(mapping.compareForChange(clone, backUp, changes, session)); } return changes; }
/** * INTERNAL: * Remove objects from parent's identity map. */ protected void postMergeChanges() { //bug 4730595: objects removed during flush are not removed from the cache during commit if (!this.getUnitOfWorkChangeSet().getDeletedObjects().isEmpty()){ oracle.toplink.essentials.internal.helper.IdentityHashtable deletedObjects = this.getUnitOfWorkChangeSet().getDeletedObjects(); for (Enumeration removedObjects = deletedObjects.keys(); removedObjects.hasMoreElements(); ) { ObjectChangeSet removedObjectChangeSet = (ObjectChangeSet) removedObjects.nextElement(); java.util.Vector primaryKeys = removedObjectChangeSet.getPrimaryKeys(); getParent().getIdentityMapAccessor().removeFromIdentityMap(primaryKeys, removedObjectChangeSet.getClassType(this)); } } }
/** * INTERNAL: * This method will be used during the merge process to either find an equivalent change set * within this UnitOfWorkChangeSet or integrate that changeset into this UOW ChangeSet */ public ObjectChangeSet findOrIntegrateObjectChangeSet(ObjectChangeSet tofind, UnitOfWorkChangeSet mergeFromChangeSet) { if (tofind == null) { return tofind; } ObjectChangeSet localChangeSet = this.findObjectChangeSet(tofind, mergeFromChangeSet); if (localChangeSet == null) {//not found locally then replace it with the one from the merging changeset localChangeSet = new ObjectChangeSet(tofind.getPrimaryKeys(), tofind.getClassType(), tofind.getUnitOfWorkClone(), this, tofind.isNew()); this.addObjectChangeSetForIdentity(localChangeSet, localChangeSet.getUnitOfWorkClone()); } return localChangeSet; }
attributeValue = session.getIdentityMapAccessorInstance().getIdentityMapManager().getFromIdentityMap(getPrimaryKeys(), getClassType(session), descriptor); query.setShouldUseWrapperPolicy(false); query.setReferenceClass(getClassType(session)); query.setSelectionKey(getPrimaryKeys()); attributeValue = session.executeQuery(query);
/** * INTERNAL: * Prepare the receiver for execution in a session. * In particular check that the tables on the descriptor are set. */ public void prepareForExecution() throws QueryException { super.prepareForExecution(); if (getObject() == null) { throw QueryException.objectToModifyNotSpecified(this); } setObject(getDescriptor().getObjectBuilder().unwrapObject(getObject(), getSession())); if (getPrimaryKey() == null) { if (getObjectChangeSet() != null) { setPrimaryKey(getObjectChangeSet().getPrimaryKeys()); } else { setPrimaryKey(getSession().keyFromObject(getObject())); } } }
original = parent.getIdentityMapAccessorInstance().getWriteLockManager().appendLock(objectChangeSet.getPrimaryKeys(), original, descriptor, this, parent); descriptor.getObjectBuilder().mergeIntoObject(original, true, clone, this); } else {
writeQuery.setPrimaryKey(objectChangeSet.getPrimaryKeys());