public override object DeepCopy(object component, EntityMode entityMode, ISessionFactoryImplementor factory) { if (component == null) { return(null); } object[] values = GetPropertyValues(component, entityMode); for (int i = 0; i < propertySpan; i++) { values[i] = propertyTypes[i].DeepCopy(values[i], entityMode, factory); } object result = Instantiate(entityMode); SetPropertyValues(result, values, entityMode); //not absolutely necessary, but helps for some //equals()/hashCode() implementations IComponentTuplizer ct = (IComponentTuplizer)tuplizerMapping.GetTuplizer(entityMode); if (ct.HasParentProperty) { ct.SetParent(result, ct.GetParent(component), factory); } return(result); }
public virtual object Instantiate(object parent, ISessionImplementor session) { object result = Instantiate(session.EntityMode); IComponentTuplizer ct = (IComponentTuplizer)tuplizerMapping.GetTuplizer(session.EntityMode); if (ct.HasParentProperty && parent != null) { ct.SetParent(result, session.PersistenceContext.ProxyFor(parent), session.Factory); } return(result); }
public ComponentEntityModeToTuplizerMapping(Mapping.Component component) { PersistentClass owner = component.Owner; // create our own copy of the user-supplied tuplizer impl map Dictionary <EntityMode, string> userSuppliedTuplizerImpls; if (component.TuplizerMap != null) { userSuppliedTuplizerImpls = new Dictionary <EntityMode, string>(component.TuplizerMap); } else { userSuppliedTuplizerImpls = new Dictionary <EntityMode, string>(); } // Build the dynamic-map tuplizer... ITuplizer dynamicMapTuplizer; string tuplizerImpl; if (!userSuppliedTuplizerImpls.TryGetValue(EntityMode.Map, out tuplizerImpl)) { dynamicMapTuplizer = new DynamicMapComponentTuplizer(component); } else { dynamicMapTuplizer = BuildComponentTuplizer(tuplizerImpl, component); userSuppliedTuplizerImpls.Remove(EntityMode.Map); } // then the pojo tuplizer, using the dynamic-map tuplizer if no pojo representation is available ITuplizer pojoTuplizer; string tempObject2; userSuppliedTuplizerImpls.TryGetValue(EntityMode.Poco, out tempObject2); userSuppliedTuplizerImpls.Remove(EntityMode.Poco); tuplizerImpl = tempObject2; if (owner.HasPocoRepresentation && component.HasPocoRepresentation) { if (tuplizerImpl == null) { pojoTuplizer = new PocoComponentTuplizer(component); } else { pojoTuplizer = BuildComponentTuplizer(tuplizerImpl, component); } } else { pojoTuplizer = dynamicMapTuplizer; } // put the "standard" tuplizers into the tuplizer map first if (pojoTuplizer != null) { AddTuplizer(EntityMode.Poco, pojoTuplizer); } if (dynamicMapTuplizer != null) { AddTuplizer(EntityMode.Map, dynamicMapTuplizer); } // then handle any user-defined entity modes.. foreach (KeyValuePair <EntityMode, string> entry in userSuppliedTuplizerImpls) { IComponentTuplizer tuplizer = BuildComponentTuplizer(entry.Value, component); AddTuplizer(entry.Key, tuplizer); } }