Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java (revision 678295) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java (working copy) @@ -348,7 +348,12 @@ // and the object id instance if the type as determined // from the indicator is a subclass of expected type sm.initialize(type, state); - + if (info != null && info.result != null) { + FieldMapping mappedByFieldMapping = info.result.getMappedByFieldMapping(); + Object mappedByObject = info.result.getMappedByValue(); + if (mappedByFieldMapping != null && mappedByObject != null) + setMappedBy(sm, mappedByFieldMapping, mappedByObject); + } // load the selected mappings into the given state manager if (res != null) { // re-get the mapping in case the instance was a subclass @@ -363,6 +368,19 @@ } } + protected void setMappedBy(OpenJPAStateManager sm, FieldMapping mappedByFieldMapping, + Object mappedByObject) { + ClassMapping mapping = (ClassMapping)sm.getMetaData(); + FieldMapping[] fms = mapping.getDeclaredFieldMappings(); + for (int i = 0; i < fms.length; i++) { + if (fms[i] == mappedByFieldMapping) { + sm.storeObject(fms[i].getIndex(), mappedByObject); + return; + } + } + } + + /** * This method is to provide override for non-JDBC or JDBC-like * implementation of getting version from the result set. Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java (revision 678295) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java (working copy) @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; +import org.apache.openjpa.enhance.PersistenceCapable; import org.apache.openjpa.jdbc.conf.JDBCConfiguration; import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration; import org.apache.openjpa.jdbc.kernel.JDBCFetchConfigurationImpl; @@ -38,6 +39,7 @@ import org.apache.openjpa.jdbc.sql.Joins; import org.apache.openjpa.jdbc.sql.LogicalUnion; import org.apache.openjpa.jdbc.sql.Result; +import org.apache.openjpa.jdbc.sql.SQLBuffer; import org.apache.openjpa.jdbc.sql.Select; import org.apache.openjpa.jdbc.sql.SelectExecutor; import org.apache.openjpa.jdbc.sql.SelectImpl; @@ -304,7 +306,34 @@ if (field.getOrderColumn() != null) seq = res.getInt(field.getOrderColumn(), orderJoins) + 1; - add(store, coll, loadElement(null, store, fetch, res, dataJoins)); + + // for inverseEager field + FieldMapping mappedByFieldMapping = field.getMappedByMapping(); + PersistenceCapable mappedByValue = null; + Object val = null; + + if (mappedByFieldMapping != null) { + if (oid.equals(sm.getObjectId())) { + mappedByValue = sm.getPersistenceCapable(); + res.setMappedByFieldMapping(mappedByFieldMapping); + res.setMappedByValue(mappedByValue); + } else if (((Collection)coll).size() > 0) { + PersistenceCapable pc = (PersistenceCapable)((Collection)coll).iterator().next(); + OpenJPAStateManager sm1 = (OpenJPAStateManager)pc.pcGetStateManager(); + FieldMapping[] fms = ((ClassMapping)sm1.getMetaData()).getDeclaredFieldMappings(); + for (int i = 0; i < fms.length; i++) { + if (fms[i] == mappedByFieldMapping) { + res.setMappedByValue(sm1.fetchObject(fms[i].getIndex())); + break; + } + } + } else { + res.setMappedByValue(null); + } + } + + val = loadElement(null, store, fetch, res, dataJoins); + add(store, coll, val); } res.close(); @@ -310,7 +339,7 @@ return rels; } - + /** * Extract the oid value from the given result. If the next oid is the * same as the given one, returns the given JVM instance. Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractResult.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractResult.java (revision 678295) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractResult.java (working copy) @@ -80,6 +80,8 @@ private boolean _locking = false; private boolean _ignoreNext = false; private boolean _last = false; + private FieldMapping _mappedByFieldMapping = null; + private Object _mappedByValue = null; public Object getEager(FieldMapping key) { Map map = getEagerMap(true); @@ -118,6 +120,9 @@ */ public void close() { closeEagerMap(_eager); + _mappedByFieldMapping = null; + _mappedByValue = null; + } /** @@ -238,6 +243,24 @@ _base = base; } + public FieldMapping getMappedByFieldMapping() { + return (_gotEager) ? null : _mappedByFieldMapping; + } + + public void setMappedByFieldMapping(FieldMapping fieldMapping) { + _mappedByFieldMapping = fieldMapping; + } + + public Object getMappedByValue() { + return (_gotEager) ? null : _mappedByValue; + } + + public void setMappedByValue(Object mappedByValue) { + _mappedByValue = mappedByValue; + } + + + public int indexOf() { return _index; } Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MergedResult.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MergedResult.java (revision 678295) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MergedResult.java (working copy) @@ -210,6 +210,22 @@ public void setBaseMapping(ClassMapping mapping) { _res[_idx].setBaseMapping(mapping); } + + public FieldMapping getMappedByFieldMapping() { + return _res[_idx].getMappedByFieldMapping(); + } + + public void setMappedByFieldMapping(FieldMapping fieldMapping) { + _res[_idx].setMappedByFieldMapping(fieldMapping); + } + + public Object getMappedByValue() { + return _res[_idx].getMappedByValue(); + } + + public void setMappedByValue(Object mappedByValue) { + _res[_idx].setMappedByValue(mappedByValue); + } public int indexOf() { return _res[_idx].indexOf(); Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Result.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Result.java (revision 678295) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Result.java (working copy) @@ -159,6 +159,14 @@ * from the row. */ public void setBaseMapping(ClassMapping mapping); + + public FieldMapping getMappedByFieldMapping(); + + public void setMappedByFieldMapping(FieldMapping fieldMapping); + + public Object getMappedByValue(); + + public void setMappedByValue(Object mappedByValue); /** * The index of the select within the UNION that the current row