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.

Reply via email to