Index: cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomainInsertBucket.java =================================================================== --- cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomainInsertBucket.java (revision 603157) +++ cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomainInsertBucket.java (working copy) ..-36,6 +36,7 @@ import org.apache.cayenne.map.EntitySorter; import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.map.ObjRelationship; import org.apache.cayenne.query.InsertBatchQuery; /** ..-145,6 +146,35 @@ idMap.put(dbAttrName, object.readPropertyDirectly(objAttr.getName())); continue; } + + // handle PKs behind to-one relationships + boolean found = false; + for (Iterator relIter = dbEntity.getRelationships().iterator(); relIter + .hasNext();) { + DbRelationship relationship = (DbRelationship) relIter.next(); + if (relationship.isToMany()) + continue; + for (Iterator joinIter = relationship.getJoins().iterator(); joinIter + .hasNext();) { + DbJoin join = (DbJoin) joinIter.next(); + if (join.getSourceName().equals(dbAttrName)) { + ObjRelationship objRel = objEntity + .getRelationshipForDbRelationship(relationship); + DataObject target = (DataObject) object.readProperty(objRel + .getName()); + idMap.put(dbAttrName, target + .getObjectId() + .getIdSnapshot() + .get(join.getTargetName())); + found = true; + break; + } + } + if (found) + break; + } + if (found) + continue; // only a single key can be generated from DB... if this is done already // in this loop, we must bail out.