There are two way to create a clone.Deep copy or shallow copy ?

2009/5/18 domonkos <[email protected]>

>
> NHibernate removes entities of a many-to-one relationship from
> previous owner after cloning.
> I have a business object which holds different kind of lists:
>
> public class BusinessObject
> {
>        int ID{get;set;}
>        IList Entites{get;set;}
>        ...
> }
>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-
> import="false">
>        <class name="MainNamespace.BusinessObject, Model"
> table="Businessobject">
>                <jcs-cache usage="read-write" />
>                <id name="ID" type="Int32" unsaved-value="0">
>                        <generator class="identity" />
>                </id>
>        ...
>                <list name="Units" lazy="true">
>                        <key column="BusinessObjectID" />
>                        <index column="BusinessObjectIndex" />
>                        <one-to-many class="MainNamespace.BusinessObject,
> Model" />
>                </list>
>
> This is an example entity:
>
> public class Entity
> {
>        int ID{get;set;}
>        ...
> }
>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-
> import="false">
>        <class name="MainNamespace.Entity, Model" table="Entity">
>                <jcs-cache usage="read-write" />
>                <id name="ID" type="Int32" unsaved-value="0">
>                        <generator class="identity" />
>                </id>
>        ...
>                <many-to-one name="BusinessObject"
> class="MainNamespace.BusinessObject, Model" column="BusinessObjectID" /
> >
>
> One noteable thing is that the entity contains a backward reference to
> the BusinessObject in its mapping.
>
> I don't use cascade because of the complexity of my lists and business
> workflows.
> The cloning process starts by creating 'new version' of business
> entites by removing them from the session and set their ID-s to zero
> to mar them as 'unsaved'.
>
> Here is an example of cloning a list in my business object:
>
> foreach(Entity entity in businessObjects)
> {
>        //New entity nothing has to be done
>        if(entity.ID == 0) continue;
>
>        //Evict old entity from session
>        NHibernateSession.Evict(entity);
>        //Mark as unsaved
>        entity.ID = 0;
> }
>
> The cloning process for the main business object goes by the same way
> which means an evict and setting its ID to 0.
> So after this I'll end up with an unsaved instance of my
> businessobject and all of my list entites.
>
> This is the point where I will do a 'full save' on all entites. As I
> can not use cascade saving I iterate through all basic entites and
> save them.
> But at first I save the whole BusinessObject.
>
> //Copy to a temporary list
> IList entites = businessObject.Entites;
> //Empty the list
> businessObject.Entites = null;
>
> //Save the BusinessObject
> NHibernateSession.Save(businessObject);
>
> //Saving Lists
> if(entites != null)
> {
>        foreach(Entity entity in entites)
>        {
>                NHibernateSession.Save(entity);
>        }
>
>        //Set back the list
>        businessObject.Entites = entites
> }
>
> After this point whenever a Flush is happening NHibernate will
> generate a query which removes all entites from the previous version
> of the BusinessObject.
>
> So for instance if the original ID of a BusinessObject was 1980 and
> I've set it to 0 in the clone process, the ID will be 1981 when I do
> the full save which is correct, but when a Flush is happening in the
> full save or I commit the transaction a sql query like this will also
> will be ran by NHibernate:
> exec sp_executesql N'UPDATE [Entity] SET BusinessObjectID = null,
> BusinessObjectIndex = null WHERE BusinessObjectID = @p0', N'@p0
> int',@p0 = 1980
>
> Where the parameter is the ID of the prevoius BusinessObject. In this
> case every of my entites will be removed from the previous business
> object.
>
> I don't understand why is this happening. This beahavior did not exist
> in the earlier version of NHibernate. I thought that evict removes the
> previous version of my BusinessObject from the session,
> I'm not sure how NHibernate 'knows' that the owner has been changed.
> How can this behavior fixed?
>
>
>
> >
>


-- 
Fabio Maulo

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to