Index: cpa/src/main/java/org/exolab/castor/persist/ClassMolder.java =================================================================== --- cpa/src/main/java/org/exolab/castor/persist/ClassMolder.java (revision 7970) +++ cpa/src/main/java/org/exolab/castor/persist/ClassMolder.java (working copy) @@ -532,7 +532,7 @@ // load the fields from the persistent storage if the cache is empty // or the access mode is DBLOCKED (thus guaranteeing that a lock at the // database level will be created) - if (!proposedObject.isFieldsSet() || accessMode == AccessMode.DbLocked) { + if (!proposedObject.isFieldsInitialized() || accessMode == AccessMode.DbLocked) { proposedObject.initializeFields(_fhs.length); if (results != null) { results.getQuery().fetch(proposedObject); @@ -544,7 +544,9 @@ oid.setDbLock(accessMode == AccessMode.DbLocked); // store (new) field values to cache - locker.setObject(tx, proposedObject.getFields(), System.currentTimeMillis()); + if (!proposedObject.isExpanded()) { + locker.setObject(tx, proposedObject.getFields(), System.currentTimeMillis()); + } } proposedObject.setActualClassMolder(this); Index: cpa/src/main/java/org/exolab/castor/persist/LockEngine.java =================================================================== --- cpa/src/main/java/org/exolab/castor/persist/LockEngine.java (revision 7970) +++ cpa/src/main/java/org/exolab/castor/persist/LockEngine.java (working copy) @@ -345,7 +345,7 @@ // if object has been expanded, return early if (proposedObject.isExpanded()) { // Current transaction holds lock for old OID - typeInfo.release(oid, tx); + return lock.getOID(); } else { if (_log.isDebugEnabled()) { _log.debug(Messages.format("jdo.loading.with.id", Index: cpa/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java =================================================================== --- cpa/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java (revision 7970) +++ cpa/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java (working copy) @@ -336,7 +336,7 @@ if ((potentialLeafDescriptor != null) && !potentialLeafDescriptor.getJavaClass().getName().equals(_type)) { - entity.initializeFields(potentialLeafDescriptor.getFields().length); + entity.initializeFields(((Number) returnValues[1]).intValue()); entity.setActualEntityClass(potentialLeafDescriptor.getJavaClass()); entity.setExpanded(true); } Index: cpa/src/main/java/org/castor/persist/ProposedEntity.java =================================================================== --- cpa/src/main/java/org/castor/persist/ProposedEntity.java (revision 7970) +++ cpa/src/main/java/org/castor/persist/ProposedEntity.java (working copy) @@ -107,7 +107,7 @@ * Indicates whether the fields are set, i.e. not null. * @return True if fields are set, i.e. not null(. */ - public boolean isFieldsSet() { + public boolean isFieldsInitialized() { return (_fields != null); } @@ -234,6 +234,7 @@ public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("<"); + buffer.append("isExpanded=" + _isExpanded); buffer.append("proposedEntityClass=" + _proposedEntityClass); buffer.append("; actualEntityClass=" + _actualEntityClass); buffer.append("; entity=" + _entity); @@ -247,6 +248,21 @@ return buffer.toString(); } + public boolean isFieldsSet() { + if (_fields != null && _fields.length > 0) { + boolean allFieldsNull = true; + for (int i = 0; i < _fields.length; i++) { + if (_fields[i] != null) { + allFieldsNull = false; + } + } + + return !allFieldsNull; + } + + return isFieldsInitialized(); + } + public boolean isObjectLockObjectToBeIgnored() { return _objectLockObjectToBeIgnored; }