Fix for bug  389818
Reviewed by Blaise Doughan
diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/UnmarshalRecord.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/UnmarshalRecord.java
index 41c8b76..eb75855 100644
--- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/UnmarshalRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/UnmarshalRecord.java
@@ -1359,7 +1359,6 @@
     	}else{

 	    	childRecord = (UnmarshalRecord) treeObjectBuilder.createRecord(session);

 	        childRecord.setUnmarshaller(unmarshaller);

-	        childRecord.session = this.session;

 	        childRecord.setTextWrapperFragment(textWrapperFragment);

 	        childRecord.setXMLReader(this.xmlReader);

 	        childRecord.setFragmentBuilder(fragmentBuilder);

diff --git a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
index c9d56d8..49b46bf 100644
--- a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
@@ -465,7 +465,7 @@
      * @param namespaceInfo

      * @return newly created mapping

      */

-    public DatabaseMapping generateMapping(Property property, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {

+    public DatabaseMapping generateMapping(Property property, XMLDescriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {

         if (property.isSetXmlJavaTypeAdapter()) {

             // if we are dealing with a reference, generate mapping and return 

             if (property.isReference()) {

@@ -497,7 +497,7 @@
                         converter.setNestedConverter(((XMLCompositeDirectCollectionMapping)mapping).getValueConverter());

                         ((XMLCompositeDirectCollectionMapping)mapping).setValueConverter(converter);

                     } else {                    

-                        mapping = generateCompositeCollectionMapping(property, descriptor, namespaceInfo, valueType.getQualifiedName());

+                        mapping = generateCompositeCollectionMapping(property, descriptor,descriptorJavaClass, namespaceInfo, valueType.getQualifiedName());

                         ((XMLCompositeCollectionMapping) mapping).setConverter(new XMLJavaTypeConverter(adapterClass.getQualifiedName()));

                     }

                 } else {

@@ -588,10 +588,10 @@
         	if (property.isAnyAttribute()) {

         		return generateAnyAttributeMapping(property, descriptor, namespaceInfo);

         	}

-        	return generateMapMapping(property, descriptor, namespaceInfo);

+        	return generateMapMapping(property, descriptor, descriptorJavaClass, namespaceInfo);

         }

         if (isCollectionType(property)) {

-            return generateCollectionMapping(property, descriptor, namespaceInfo);

+            return generateCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo);

         }

         

         JavaClass referenceClass = property.getType();

@@ -604,13 +604,13 @@
                 return generateEnumCollectionMapping(property,  descriptor, namespaceInfo,(EnumTypeInfo) reference);

             }            

             if (areEquals(componentType, Object.class)){

-                XMLCompositeCollectionMapping mapping = generateCompositeCollectionMapping(property, descriptor, namespaceInfo, null);

+                XMLCompositeCollectionMapping mapping = generateCompositeCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo, null);

                 mapping.setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);

                 return mapping;

             }

             

             if (reference != null ||  componentType.isArray()){

-                return generateCompositeCollectionMapping(property, descriptor, namespaceInfo, componentType.getQualifiedName());

+                return generateCompositeCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo, componentType.getQualifiedName());

             }

             return generateDirectCollectionMapping(property, descriptor, namespaceInfo);

         }

@@ -1552,7 +1552,7 @@
         return converter;

     }

 

-    public DatabaseMapping generateCollectionMapping(Property property, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {

+    public DatabaseMapping generateCollectionMapping(Property property, XMLDescriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {

         // check to see if this should be a composite or direct mapping

         JavaClass javaClass = property.getActualType();

 

@@ -1568,10 +1568,10 @@
             if (referenceInfo.isEnumerationType()) {

                 return generateEnumCollectionMapping(property,  descriptor, namespaceInfo,(EnumTypeInfo) referenceInfo);

             }

-            return generateCompositeCollectionMapping(property, descriptor, namespaceInfo, javaClass.getQualifiedName());

+            return generateCompositeCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo, javaClass.getQualifiedName());

         }

         if (!property.isAttribute() && javaClass != null && javaClass.getQualifiedName().equals(OBJECT_CLASS_NAME)){

-            XMLCompositeCollectionMapping ccMapping = generateCompositeCollectionMapping(property, descriptor, namespaceInfo, null);

+            XMLCompositeCollectionMapping ccMapping = generateCompositeCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo, null);

             ccMapping.setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);

             return ccMapping;

         }

@@ -1705,12 +1705,12 @@
         return src.getRawName().equals(tgtCanonicalName);

     }

 

-    public XMLCompositeCollectionMapping generateMapMapping(Property property, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {

+    public XMLCompositeCollectionMapping generateMapMapping(Property property, XMLDescriptor descriptor, JavaClass descriptorClass, NamespaceInfo namespaceInfo) {

     	XMLCompositeCollectionMapping mapping = new XMLCompositeCollectionMapping();

         mapping.setAttributeName(property.getPropertyName());

         initializeXMLContainerMapping(mapping);

         XMLField field = getXPathForField(property, namespaceInfo, false);

-        JavaClass descriptorClass = helper.getJavaClass(descriptor.getJavaClassName());

+

         JavaClass mapValueClass = helper.getJavaClass(MapValue.class);

         if(mapValueClass.isAssignableFrom(descriptorClass)){

         	mapping.setXPath("entry");

@@ -1885,10 +1885,15 @@
         return mapping;

     }

 

-    public XMLCompositeCollectionMapping generateCompositeCollectionMapping(Property property, XMLDescriptor descriptor, NamespaceInfo namespaceInfo, String referenceClassName) {

+    public XMLCompositeCollectionMapping generateCompositeCollectionMapping(Property property, XMLDescriptor descriptor, JavaClass javaClass, NamespaceInfo namespaceInfo, String referenceClassName) {

         XMLCompositeCollectionMapping mapping = new XMLCompositeCollectionMapping();

         mapping.setAttributeName(property.getPropertyName());

         initializeXMLContainerMapping(mapping);

+        

+        JavaClass manyValueJavaClass = helper.getJavaClass(ManyValue.class);        

+        if (manyValueJavaClass.isAssignableFrom(javaClass)){

+            mapping.setReuseContainer(false);

+        }

         // handle read-only set via metadata

         if (property.isSetReadOnly()) {

             mapping.setIsReadOnly(property.isReadOnly());

@@ -2258,7 +2263,7 @@
 

             XMLDescriptor descriptor = info.getDescriptor();

             if (descriptor != null) {

-                generateMappings(info, descriptor, namespaceInfo);

+                generateMappings(info, descriptor, javaClass, namespaceInfo);

             }

             // set primary key fields (if necessary)

             DatabaseMapping mapping;

@@ -2289,16 +2294,16 @@
      * @param descriptor

      * @param namespaceInfo

      */

-    public void generateMappings(TypeInfo info, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {

+    public void generateMappings(TypeInfo info, XMLDescriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {

         if(info.isAnonymousComplexType()) {

             //may need to generate inherited mappings

-            generateInheritedMappingsForAnonymousType(info, descriptor, namespaceInfo);

+            generateInheritedMappingsForAnonymousType(info, descriptor, descriptorJavaClass, namespaceInfo);

         }

         List<Property> propertiesInOrder = info.getNonTransientPropertiesInPropOrder();

         for (int i = 0; i < propertiesInOrder.size(); i++) {

             Property next = propertiesInOrder.get(i);

             if (next != null && (!next.isTransient() || (next.isTransient() && next.isXmlLocation()))) {

-                DatabaseMapping mapping = generateMapping(next, descriptor, namespaceInfo);

+                DatabaseMapping mapping = generateMapping(next, descriptor, descriptorJavaClass, namespaceInfo);

                 if (next.isVirtual()) {

                     VirtualAttributeAccessor accessor = new VirtualAttributeAccessor();

                     accessor.setAttributeName(mapping.getAttributeName());

@@ -2331,14 +2336,13 @@
                     mapping.setProperties(next.getUserProperties());

                 }

                 //get package info

-                JavaClass jClass = helper.getJavaClass(info.getJavaClassName());

                 AccessorFactoryWrapper accessorFactory = info.getXmlAccessorFactory();

                 if(accessorFactory == null) {

                     accessorFactory = info.getPackageLevelXmlAccessorFactory();

                 }

                 if(accessorFactory != null) {

                     try {

-                        Object accessor = CompilerHelper.createAccessorFor(jClass, next, helper, accessorFactory);

+                        Object accessor = CompilerHelper.createAccessorFor(descriptorJavaClass, next, helper, accessorFactory);

                         

                         if(accessor != null) {

                             CustomAccessorAttributeAccessor attributeAccessor = new CustomAccessorAttributeAccessor(accessor);

@@ -2351,9 +2355,9 @@
         }

     }

 

-    private void generateInheritedMappingsForAnonymousType(TypeInfo info, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {

+    private void generateInheritedMappingsForAnonymousType(TypeInfo info, XMLDescriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {

         List<TypeInfo> mappedParents = new ArrayList<TypeInfo>();

-        JavaClass next = CompilerHelper.getNextMappedSuperClass(helper.getJavaClass(info.getJavaClassName()), typeInfo, helper);

+        JavaClass next = CompilerHelper.getNextMappedSuperClass(descriptorJavaClass, typeInfo, helper);

         while(next != null) {

             TypeInfo nextInfo = this.typeInfo.get(next.getName());

             mappedParents.add(0, nextInfo);

@@ -2364,7 +2368,7 @@
             for (int i = 0; i < propertiesInOrder.size(); i++) {

                 Property nextProp = propertiesInOrder.get(i);

                 if (nextProp != null){

-                    DatabaseMapping mapping = generateMapping(nextProp, descriptor, namespaceInfo);

+                    DatabaseMapping mapping = generateMapping(nextProp, descriptor, descriptorJavaClass, namespaceInfo);

                     descriptor.addMapping(mapping);

                     // set user-defined properties if necessary

                     if (nextProp.isSetUserProperties()) {