Composite keys are finicky. One key annoyance with them is that unless you givroperly.e them a little help, composite-key entities can't properly use SaveOrUpdate, and can't be used with cascading properly.
Two fixes. you can implement an IInterceptor, or you can add a <version> property. I haven't done the first, but I can say from experience the second is simple enough. Just a few things you need to do: 1) add a property to your class-just like any of your other properties in your class... unless you do choose to use access="field..." in this case, let's name your property LastModifiedOn. this new field is for NHibernate, not for you, so you can look, but don't mess with it yourself. (you may want to use access="field...." option so you man map directly to the private field and you don't have to expose this outside your class-you'll need to go to the NH docs and pick your naming strategy)- 2) add property to your mapping: <version name="LastModifiedOn" type="timestamp" column="LastModifiedOn" /> 3) Don't forget to add the new field to the table! Note that if you add a version column to an existing table, you're going to have to prepopulate the existing rows for your your new column with an initial datetime or you'll get errors-any date at all, so long as it's in the past. 1/1/2009 12:00:00 is as good a value as any.... On Sun, Oct 11, 2009 at 1:45 AM, mathmax <[email protected]>wrote: > > Hello, > > I try to delete an item of a collection inside a transaction. When I > flush the session I get this error because the class of the child > items is mapped with a composite Id. > > the mapping file look like this: > > <class name="Shipping" table="shipping_methods" lazy="false"> > <id name="Id" column="id"> > <generator class="assigned" /> > </id> > ... > <bag name="Days" table="delivery_days" lazy="false" cascade="all- > delete-orphan"> > <key column="shipping_method"/> > <one-to-many class="DeliveryDay" /> > </bag> > > </class> > > <class name="DeliveryDay" table="delivery_days" lazy="false"> > <!--http://journalofasoftwaredev.wordpress.com/2008/04/19/ > nhibernate-exception-unexpected-row-count-0-expected-1/--<http://journalofasoftwaredev.wordpress.com/2008/04/19/%0Anhibernate-exception-unexpected-row-count-0-expected-1/--> > > > <composite-id unsaved-value="any"> > <key-property name="ShippingMethod" column="shipping_method" /> > <key-property name="Day" /> > </composite-id> > ... > </class> > > I try with and without unsaved-value="any" on the composite-id tag > cascade="all-delete-orphan", cascade="all" and no cascade attribute on > the bag tag. > But I always get an error. > Depending on the cascade and unsaved-value attribute I get different > error messages. > With this mapping file I get this error : {"Unexpected row count: 0; > expected: 1"} > and it seems that the SQL sent to the database is an UPDATE statement > instead of a DELETE statement... very strange. > I also get sometimes this error when I try to add more than on item to > the collection : {"a different object with the same identifier value > was already associated with the session: DeliveryDays.DeliveryDay, of > entity: DeliveryDays.DeliveryDay"} > > Does anyone know what I am doing wrong with composite-key ? > > regards, > > mathmax > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
