in openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java [130:297]
protected boolean attachField(AttachManager manager, Object toAttach,
StateManagerImpl sm, FieldMetaData fmd, boolean nullLoaded) {
if (fmd.isVersion()
|| fmd.getManagement() != FieldMetaData.MANAGE_PERSISTENT)
return false;
PersistenceCapable into = sm.getPersistenceCapable();
int i = fmd.getIndex();
provideField(toAttach, sm, i);
int set = StateManager.SET_ATTACH;
Object val;
switch (fmd.getDeclaredTypeCode()) {
case JavaTypes.BOOLEAN:
sm.settingBooleanField(into, i, sm.fetchBooleanField(i),
fetchBooleanField(i), set);
break;
case JavaTypes.BYTE:
sm.settingByteField(into, i, sm.fetchByteField(i),
fetchByteField(i), set);
break;
case JavaTypes.CHAR:
sm.settingCharField(into, i, sm.fetchCharField(i),
fetchCharField(i), set);
break;
case JavaTypes.DOUBLE:
sm.settingDoubleField(into, i, sm.fetchDoubleField(i),
fetchDoubleField(i), set);
break;
case JavaTypes.FLOAT:
sm.settingFloatField(into, i, sm.fetchFloatField(i),
fetchFloatField(i), set);
break;
case JavaTypes.INT:
sm.settingIntField(into, i, sm.fetchIntField(i),
fetchIntField(i), set);
break;
case JavaTypes.LONG:
sm.settingLongField(into, i, sm.fetchLongField(i),
fetchLongField(i), set);
break;
case JavaTypes.SHORT:
sm.settingShortField(into, i, sm.fetchShortField(i),
fetchShortField(i), set);
break;
case JavaTypes.STRING:
String sval = fetchStringField(i);
if (sval == null && !nullLoaded)
return false;
sm.settingStringField(into, i, sm.fetchStringField(i), sval,
set);
break;
case JavaTypes.DATE:
case JavaTypes.CALENDAR:
case JavaTypes.LOCAL_DATE:
case JavaTypes.LOCAL_TIME:
case JavaTypes.LOCAL_DATETIME:
case JavaTypes.OFFSET_TIME:
case JavaTypes.OFFSET_DATETIME:
case JavaTypes.NUMBER:
case JavaTypes.BOOLEAN_OBJ:
case JavaTypes.BYTE_OBJ:
case JavaTypes.CHAR_OBJ:
case JavaTypes.DOUBLE_OBJ:
case JavaTypes.FLOAT_OBJ:
case JavaTypes.INT_OBJ:
case JavaTypes.LONG_OBJ:
case JavaTypes.SHORT_OBJ:
case JavaTypes.BIGDECIMAL:
case JavaTypes.BIGINTEGER:
case JavaTypes.LOCALE:
case JavaTypes.OBJECT:
case JavaTypes.OID:
case JavaTypes.ENUM:
val = fetchObjectField(i);
if (val == null && !nullLoaded)
return false;
sm.settingObjectField(into, i, sm.fetchObjectField(i), val,
set);
break;
case JavaTypes.PC:
case JavaTypes.PC_UNTYPED:
Object frmpc = fetchObjectField(i);
if (frmpc == null && !nullLoaded)
return false;
OpenJPAStateManager tosm = manager.getBroker().getStateManager
(sm.fetchObjectField(i));
PersistenceCapable topc = (tosm == null) ? null
: tosm.getPersistenceCapable();
if (frmpc != null || topc != null) {
if (fmd.getCascadeAttach() == ValueMetaData.CASCADE_NONE) {
// Use the attached copy of the object, if available
PersistenceCapable cpy = manager.getAttachedCopy(frmpc);
if (cpy != null) {
frmpc = cpy;
} else {
frmpc = getReference(manager, frmpc, sm, fmd);
}
}
else {
PersistenceCapable intopc = topc;
if (!fmd.isEmbeddedPC() && frmpc != null && topc != null
&& !Objects.equals(topc.pcFetchObjectId(),
manager.getDetachedObjectId(frmpc))) {
intopc = null;
}
frmpc = manager.attach(frmpc, intopc, sm, fmd, false);
}
if (frmpc != topc)
sm.settingObjectField(into, i, topc, frmpc, set);
}
break;
case JavaTypes.COLLECTION:
Collection frmc = (Collection) fetchObjectField(i);
if (frmc == null && !nullLoaded)
return false;
Collection toc = (Collection) sm.fetchObjectField(i);
if ((toc != null && !toc.isEmpty())
|| frmc != null && !frmc.isEmpty()) {
if (frmc == null)
sm.settingObjectField(into, i, toc, null, set);
else if (toc == null) {
sm.settingObjectField(into, i, null,
attachCollection(manager, frmc, sm, fmd), set);
} else if (toc instanceof Set && frmc instanceof Set)
replaceCollection(manager, frmc, toc, sm, fmd);
else {
sm.settingObjectField(into, i, toc,
replaceList(manager, frmc, toc, sm, fmd), set);
}
}
break;
case JavaTypes.MAP:
Map frmm = (Map) fetchObjectField(i);
if (frmm == null && !nullLoaded)
return false;
Map tom = (Map) sm.fetchObjectField(i);
if ((tom != null && !tom.isEmpty())
|| (frmm != null && !frmm.isEmpty())) {
if (frmm == null)
sm.settingObjectField(into, i, tom, null, set);
else if (tom == null)
sm.settingObjectField(into, i, null,
attachMap(manager, frmm, sm, fmd), set);
else
replaceMap(manager, frmm, tom, sm, fmd);
}
break;
case JavaTypes.ARRAY:
Object frma = fetchObjectField(i);
if (frma == null && !nullLoaded)
return false;
Object toa = sm.fetchObjectField(i);
if ((toa != null && Array.getLength(toa) > 0)
|| (frma != null && Array.getLength(frma) > 0)) {
if (frma == null)
sm.settingObjectField(into, i, toa, null, set);
else
sm.settingObjectField(into, i, toa,
replaceArray(manager, frma, toa, sm, fmd), set);
}
break;
default:
throw new InternalException(fmd.toString());
}
return true;
}