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
|