Try using a <key-many-to-one > in RoleSecurityItemPermission's composite ID instead of a <key-property > ; I didn't see anything in the mapping to let NHibernate know that the composite ID is related to the associated Role & SecurityItem
/Pete From: [email protected] [mailto:[email protected]] On Behalf Of Sudripto Sent: 14 December 2012 09:34 To: [email protected] Subject: [nhusers] Composite Key cascade issue I have 3 tables - Role, SecurityItem and RoleSecurityItemPermission <class name="Role" table="Role" lazy="true" > <cache usage="nonstrict-read-write"/> <id name="Id"> <generator class="hilo"> <param name="table">hibernate_unique_key</param> <param name="column">NextHi</param> <param name="where">TableName='Role'</param> <param name="max_lo">100</param> </generator> </id> <property name="Name"> <column name="Name" sql-type="nvarchar" not-null="true" /> </property> <property name="Description"> <column name="Description" sql-type="nvarchar" not-null="false" /> </property> <bag name="RoleSecurityItemPermissions" generic="true" inverse="true" cascade="all" lazy="true"> <key column="Role" /> <one-to-many class="RoleSecurityItemPermission" /> </bag> </class> <class name="SecurityItem" table="SecurityItem" lazy="true"> <cache usage="nonstrict-read-write"/> <id name="Id"> <generator class="hilo"> <param name="table">hibernate_unique_key</param> <param name="column">NextHi</param> <param name="where">TableName='SecurityItem'</param> <param name="max_lo">100</param> </generator> </id> <property name="Name"> <column name="Name" sql-type="nvarchar" not-null="true" /> </property> <bag name="RoleSecurityItemPermissions" generic="true" inverse="true" cascade="delete"> <key column="SecurityItem" /> <one-to-many class="RoleSecurityItemPermission" /> </bag> </class> <class name="RoleSecurityItemPermission" table="RoleSecurityItemPermissions" lazy="true" dynamic-insert="true"> <cache usage="nonstrict-read-write"/> <composite-id name="RoleSecurityIdentifier" class="RoleSecurityIdentifier"> <key-property name="RoleId" column="Role" type="Int32" /> <key-property name="SecurityItemId" column="SecurityItem" type="Int32" /> </composite-id> <many-to-one name="Role" insert="false" update="false" cascade="none" > <column name="Role" /> </many-to-one> <many-to-one name="SecurityItem" insert="false" update="false" cascade="none"> <column name="SecurityItem" /> </many-to-one> <property name="AllowCreate"> <column name="AllowCreate" sql-type="bit" not-null="true" /> </property> <property name="AllowRead"> <column name="AllowRead" sql-type="bit" not-null="true" /> </property> <property name="AllowUpdate"> <column name="AllowUpdate" sql-type="bit" not-null="true" /> </property> <property name="AllowDelete"> <column name="AllowDelete" sql-type="bit" not-null="true" /> </property> </class> My requirement for persisting the above are as follows [Test] public void TestCreateRoleSecurityItemPermission() { 1 ISecurityItemDao securityItemDaoObject = new SecurityItemDao(); 2 SecurityItem securityItem = new SecurityItem(); 3 securityItem.Name = "Workspace" + DateTime.Now.Millisecond; 4 securityItemDaoObject.Add(securityItem); // This works fine 5 IRoleDao roleDaoObject = new RoleDao(); 6 Role role = new Role(); 7 role.Name = "Administrator_" + 1; 8 role.Description = "Chief Administrator"; 9 //roleDaoObject.Add(role); 10 RoleSecurityItemPermission roleSecurityItemPermission = new RoleSecurityItemPermission(); 11 roleSecurityItemPermission.Role = role; 12 roleSecurityItemPermission.SecurityItem = securityItem; 13 roleSecurityItemPermission.RoleSecurityIdentifier.RoleId = role.Id; 14 roleSecurityItemPermission.RoleSecurityIdentifier.SecurityItemId = securityItem.Id; 15 role.RoleSecurityItemPermissions.Add(roleSecurityItemPermission); 16 //IRoleSecurityItemPermissionDao roleSecurityItemPermissionDaoObject = new RoleSecurityItemPermissionDao(); 17 //roleSecurityItemPermissionDaoObject.Add(roleSecurityItemPermission); 18 roleDaoObject.Add(role); //Fails to set the role.Id in line 13 // If I uncomment line number 9, 16 &17 and comment line 18 then everything works fine but I want to cascade insert using only one session.Save call } public Add(GuruRole role) { ........... transaction = session.BeginTransaction(); session.Save(role); // generates the id for role but is unable to set the role.id in the roleSecurityItemPermission.RoleSecurityIdentifier.RoleId transaction.Commit(); ............ } -- You received this message because you are subscribed to the Google Groups "nhusers" group. To view this discussion on the web visit https://groups.google.com/d/msg/nhusers/-/VWstlrfoo7oJ. 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. !DSPAM:1,50cb2c3274177375220170! -- 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.
