These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: NH.2.0.1-Inserting Parent when Children have generated ids
PostPosted: Tue Dec 09, 2008 1:01 pm 
Newbie

Joined: Tue Dec 09, 2008 12:23 pm
Posts: 3
Since upgrading to NHibernate 2.0.1 from 1.2.1, classes with generated Ids can only be inserted into the Database as standalone objects. When they are properties of other classes, Exceptions get thrown consitently at insert time:

In the case of objects in a list (>1): Nhibernate.NonUniqueObjectException :
{"a different object with the same identifier value was already associated with the session: 0, of entity: Test.Api.SubObject"}

In the case of objects as Properties
{"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK4AE1A044B687B8D1\". The conflict occurred in database \"test_application\", table \"dbo.SubObjects\", column 'Id'.\r\nThe statement has been terminated."}
(Generated Sql : INSERT INTO DbObjects (DateModified, DateCreated, Name, FirstChild, Id) VALUES (@p0, @p1, @p2, @p3, @p4); @p0 = '12/9/2008 11:51:28 AM', @p1 = '12/9 /2008 4:51:28 PM', @p2 = 'Parent', @p3 = '0', @p4 = '788c99b3-7cf5-4b7e-8814-1f476e5605bb')

As best as I can tell, either the ids are never being generated or assigned to the objects or the order of execution is incorrect.

The same mapping schema worked in 1.2.1. I couldn't find any documentation that would indicate this would break. Were there any changes that would cause this behaviour or has anyone else seen this and found a fix?

Hibernate version:
2.0.1.GA

Mapping documents:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Test.Api.DbObject, Test.Api" proxy="Test.Api.IDbObject, Test.Api" table="DbObjects" lazy="false" >
<id name="_Id" column="Id" type="string" length="36">
<generator class="assigned" />
</id>
<version column="DateModified" name="DateModified" type="Timestamp" />
<property column="DateCreated" name="DateCreated" type="Timestamp" />

<property column="Name" name="Name" type="string" />
<bag name="Children" cascade="all-delete-orphan" inverse="true">
<key column="DbObjectId" />
<one-to-many class="Test.Api.SubObject, Test.Api"/>
</bag>
</class>


<class name="Test.Api.SubObject, Test.Api" proxy="Test.Api.ISubObject, Test.Api" table="SubObjects" lazy="false" >
<id name="Id" column="Id" type="int" unsaved-value="0">
<generator class="native" />
</id>
<version column="DateModified" name="DateModified" type="Timestamp" />
<property column="DateCreated" name="DateCreated" type="Timestamp" />

<property column="Name" name="Name" type="string" />
</class>
</hibernate-mapping>

Full stack trace of any exception that occurs:
at NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformUpdate(SaveOrUpdateEvent event, Object entity, IEntityPersister persister)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsDetached(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj)
at NHibernate.Engine.CascadingAction.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollectionElements(Object child, CollectionType collectionType, CascadeStyle style, IType elemType, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollection(Object child, CascadeStyle style, Object anything, CollectionType type)
at NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.CascadeAfterSave(IEventSource source, IEntityPersister persister, Object entity, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.Save(Object obj)
at Spring.Data.NHibernate.SaveObjectHibernateCallback.DoInHibernate(ISession session)
at Spring.Data.NHibernate.HibernateTemplate.Execute(IHibernateCallback action, Boolean exposeNativeSession)


Name and version of the database you are using:
MSSQL 2005


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 09, 2008 2:32 pm 
Expert
Expert

Joined: Thu Dec 14, 2006 5:57 am
Posts: 1185
Location: Zurich, Switzerland
You've declared the collection as inverse, but the other end of the association is missing (many-to-one on SubObject). Is this just missing in the post or is it also missing in your code ?

_________________
--Wolfgang


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 09, 2008 2:39 pm 
Newbie

Joined: Tue Dec 09, 2008 12:23 pm
Posts: 3
The inverse="true" was added when i was trying to diagnose/fix the problem. It should not be there. The same problem exists regardless of whether the collection is declared as inverse.

Also, If a reference to the parent is added to SubObject, with a many-to-one mapping, the same error also exists.

The Ids its complaining about should be generated and assigned by hibernate, but they always have their default value of 0


Top
 Profile  
 
 Post subject:
PostPosted: Fri Feb 13, 2009 9:40 am 
Newbie

Joined: Fri Feb 13, 2009 9:23 am
Posts: 1
Location: Washington, DC
I just ran into this problem when I upgraded from NHibernate 1.2 to 2.0. Is there any solution besides turning off cascading or reverting back to 1.2?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Feb 13, 2009 10:07 am 
Newbie

Joined: Tue Dec 09, 2008 12:23 pm
Posts: 3
I haven't found a solution, so I'm still running 1.2 here :(


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.