Index: src/main/java/org/exolab/castor/persist/ClassMolder.java =================================================================== --- src/main/java/org/exolab/castor/persist/ClassMolder.java (Revision 7063) +++ src/main/java/org/exolab/castor/persist/ClassMolder.java (Arbeitskopie) @@ -530,34 +530,32 @@ // should be loaded from the persistence storage proposedObject.setFields(null); - // try to load the field values from the cache, except when being told - // to ignore them - if (!proposedObject.isObjectLockObjectToBeIgnored()) { - Object[] cachedFieldValues = locker.getObject(tx); - if (_log.isDebugEnabled()) { - StringBuffer buffer = new StringBuffer(80); - buffer.append("Field values loaded from cache: "); - if (cachedFieldValues != null) { - buffer.append("["); - for (int i = 0; i < cachedFieldValues.length; i++) { - buffer.append(cachedFieldValues[i]); - if (i > 0) { - buffer.append (","); - } + // try to load the field values from the object lock + Object[] cachedFieldValues = locker.getObject(tx); + if (_log.isDebugEnabled()) { + StringBuffer buffer = new StringBuffer(80); + buffer.append("Field values loaded from cache: "); + if (cachedFieldValues != null) { + buffer.append("["); + for (int i = 0; i < cachedFieldValues.length; i++) { + buffer.append(cachedFieldValues[i]); + if (i > 0) { + buffer.append (","); } - buffer.append("]"); - } else { - buffer.append("null"); } + buffer.append("]"); + } else { + buffer.append("null"); } - proposedObject.setFields(cachedFieldValues); + _log.debug(buffer.toString()); } + proposedObject.setFields(cachedFieldValues); // 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) { - proposedObject.initializeFields(_fhs.length); + if (!proposedObject.isFieldsInitialized() || accessMode == AccessMode.DbLocked) { + proposedObject.initializeFields(_fhs.length); if (results != null) { stamp = results.getQuery().fetch(proposedObject); } else { @@ -572,23 +570,24 @@ sb.append(proposedObject.getProposedEntityClass()); sb.append(" to "); sb.append(proposedObject.getActualEntityClass()); - sb.append(", with the field values to set as follows:\n"); + sb.append(", with the field values to set as follows: "); for (int i = 0; i < proposedObject.getNumberOfFields(); i++) { sb.append("field "); sb.append(i + 1); sb.append(": "); sb.append(proposedObject.getField(i)); - sb.append('\n'); + sb.append(", "); } _log.debug(sb); } } oid.setDbLock(accessMode == AccessMode.DbLocked); - - // store (new) field values to cache - locker.setObject(tx, proposedObject.getFields()); + if (!proposedObject.isExpanded()) { + locker.setObject(tx, proposedObject.getFields()); + } + } proposedObject.setActualClassMolder(this); Index: src/main/java/org/exolab/castor/persist/LockEngine.java =================================================================== --- src/main/java/org/exolab/castor/persist/LockEngine.java (Revision 7055) +++ src/main/java/org/exolab/castor/persist/LockEngine.java (Arbeitskopie) @@ -397,8 +397,6 @@ // if object has been expanded, return early if (proposedObject.isExpanded()) { - // Current transaction holds lock for old OID - typeInfo.release(oid, tx); return oid; } @@ -430,7 +428,9 @@ } throw e; } finally { - if ( lock != null ) lock.confirm( tx, succeed ); + if (lock != null) { + lock.confirm(tx, succeed); + } } return oid; } Index: src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java =================================================================== --- src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java (Revision 7055) +++ src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java (Arbeitskopie) @@ -263,7 +263,7 @@ throws PersistenceException { PreparedStatement stmt = null; ResultSet rs = null; - + SQLColumnInfo[] ids = _engine.getColumnInfoForIdentities(); SQLFieldInfo[] fields = _engine.getInfo(); @@ -311,7 +311,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: src/main/java/org/castor/persist/ProposedEntity.java =================================================================== --- src/main/java/org/castor/persist/ProposedEntity.java (Revision 7055) +++ src/main/java/org/castor/persist/ProposedEntity.java (Arbeitskopie) @@ -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); @@ -255,5 +256,20 @@ _objectLockObjectToBeIgnored = lockObjectToBeIgnored; } + 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(); + } + //-------------------------------------------------------------------------- }