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
-~----------~----~----~----~------~----~------~--~---