-->
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.  [ 3 posts ] 
Author Message
 Post subject: composite-id question
PostPosted: Mon Mar 17, 2008 4:33 pm 
Newbie

Joined: Mon Mar 17, 2008 3:36 pm
Posts: 4
Hi,

I'm rather new to NHibernate. I've been wandering around the forums for answers, but couldn't find one. I've been spiking NHibernate for use in an enterprise application. I'm using NHibernate 1.2.1.

Here is the mapping file:

Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
   <class name="NHibernateSpike.Domain.Model.ActiveAuthorization, NHibernateSpike"
           table="Authorization"
           lazy="false">
      <id name="Id" type="Int64" unsaved-value="-1" access="field.camelcase-underscore">
         <column name="Id" sql-type="int" not-null="true" unique="true"/>
         <generator class="native"/>
      </id>
      <many-to-one name="Draft"
                     class="NHibernateSpike.Domain.Model.DraftAuthorization, NHibernateSpike"
                     column="Draft"
                     access="field.camelcase-underscore"
                     cascade="all"/>
   </class>
   <class name="NHibernateSpike.Domain.Model.DraftAuthorization, NHibernateSpike"
           table="Authorization"
           lazy="false">
      <id name="Id" type="Int64" unsaved-value="-1" access="field.camelcase-underscore">
         <column name="Id" sql-type="int" not-null="true" unique="true"/>
         <generator class="native"/>
      </id>

      <set name="PermissionsOnFunctionality" table="PermissionOnFunctionality" access="field.camelcase-underscore"
          lazy="false" cascade="all">
            <key column="AuthorizationId"/>
            <one-to-many class="NHibernateSpike.Domain.Model.PermissionOnFunctionality, NHibernateSpike"/>
        </set>
   </class>
      
   <class name="NHibernateSpike.Domain.Model.PermissionOnFunctionality, NHibernateSpike"
           table="PermissionOnFunctionality" lazy="false">
      <composite-id>
         <key-many-to-one name="DraftAuthorization" column="AuthorizationId" class="NHibernateSpike.Domain.Model.DraftAuthorization, NHibernateSpike" access="field.camelcase-underscore" lazy="false"/>
         <key-many-to-one name="Functionality" column="FunctionalityCode" class="NHibernateSpike.Domain.Model.Functionality, NHibernateSpike" access="field.camelcase-underscore" lazy="false"/>
      </composite-id>
      <property name="AccessCode" column="AccessCode" access="field.camelcase-underscore"/>
   </class>
   
   <class name="NHibernateSpike.Domain.Model.Functionality, NHibernateSpike"
           table="Functionality"
           lazy="false">
      <id name="Code" type="String" access="field.camelcase-underscore">
         <column name="Code" sql-type="varchar" not-null="true" unique="true"/>
         <generator class="assigned"/>
      </id>
   </class>
</hibernate-mapping>


And here is the code (please ignore the quality: it's part of a spike, so its throw-away code):

Code:
   

//
// Authorization
//
public abstract class Authorization
{
    private readonly Int64 _id;
    private readonly ISet<PermissionOnFunctionality> _permissionsOnFunctionality =
        new HashedSet<PermissionOnFunctionality>();

    protected void AddPermissionOnFunctionality(PermissionOnFunctionality permissionOnFunctionality)
    {
        _permissionsOnFunctionality.Add(permissionOnFunctionality);
    }

    protected void RemovePermissionOnFunctionality(PermissionOnFunctionality permissionOnFunctionality)
    {
  _permissionsOnFunctionality.Remove(permissionOnFunctionality);
    }

    public Int64 Id
    {
        get { return _id; }
    }

    public IEnumerable<PermissionOnFunctionality> PermissionsOnFunctionality
    {
        get { return _permissionsOnFunctionality; }
    }
}

//
// ActiveAuthorization
//
public class ActiveAuthorization : Authorization
{
    private DraftAuthorization _draft;

    public DraftAuthorization Draft
    {
        get { return _draft; }
    }
}

//
// DraftAuthorization
//
public class DraftAuthorization : Authorization
{
    private DateTime _expirationDate;

    private PermissionOnFunctionality FindPermissionOnFunctionality(Functionality functionality)
    {
        List<PermissionOnFunctionality> permissionsOnFunctionalities = new List<PermissionOnFunctionality>(PermissionsOnFunctionality);
        return permissionsOnFunctionalities.Find(delegate(PermissionOnFunctionality permissionOnFunctionality)
                                                 {
                                                     return
                                                         permissionOnFunctionality.Functionality.Code ==
                                                         functionality.Code;
                                                 });
    }

    public DraftAuthorization()
    {
        _expirationDate = DateTime.Today.AddDays(1);
    }

    public DateTime ExpirationDate
    {
        get { return _expirationDate; }
        set { _expirationDate = value; }
    }

    public void GrantPermissionTo(Functionality functionality, Int32 accessCode)
    {
        PermissionOnFunctionality permissionOnFunctionality = FindPermissionOnFunctionality(functionality);
        if(null == permissionOnFunctionality)
        {
            PermissionOnFunctionality newPermissionOnFunctionality = new PermissionOnFunctionality(this, functionality, accessCode);
            AddPermissionOnFunctionality(newPermissionOnFunctionality);
        }
        else
        {
            permissionOnFunctionality.AccessCode = accessCode;           
        }
    }

    public void RevokePermissionTo(Functionality functionality)
    {
        PermissionOnFunctionality permissionOnFunctionality = FindPermissionOnFunctionality(functionality);
        if(null != permissionOnFunctionality)
        {
            RemovePermissionOnFunctionality(permissionOnFunctionality);
        }
    }
}

//
// PermissionOnFunctionality
//
public class PermissionOnFunctionality
{
private readonly DraftAuthorization _draftAuthorization;
    private readonly Functionality _functionality;
    private Int32 _accessCode;

internal PermissionOnFunctionality()
{}
   
    public PermissionOnFunctionality(ActiveAuthorization activeAuthorization, Functionality functionality, Int32 accessCode)
    {
        _functionality = functionality;
        _accessCode = accessCode;
_activeAuthorization = activeAuthorization;
    }

public Functionality Functionality
{
  get { return _functionality; }
}

public Int32 AccessCode
    {
        get { return _accessCode; }
        set { _accessCode = value; }
    }

    public override Boolean Equals(Object obj)
    {
        // Check for null reference or different type
  PermissionOnFunctionality other = obj as PermissionOnFunctionality;
  if(null == other || GetType() != other.GetType())
  {
      return false;
  }

  // Check for same object reference
  if(this == other)
  {
      return true;
  }

  return (Functionality.Code == other.Functionality.Code) &&
         (_draftAuthorization.Id == other._draftAuthorization.Id);
    }

    public override Int32 GetHashCode()
    {
  return Functionality.Code.GetHashCode() ^ _draftAuthorization.Id.GetHashCode();
    }
}

//
// AuthorizationService
//
public class AuthorizationService
{
    private readonly IAuthorizationRepository _authorizationRepository;
    private readonly IFunctionalityRepository _functionalityRepository;

    public AuthorizationService(IAuthorizationRepository authorizationRepository,
                                IFunctionalityRepository functionalityRepository)
    {
        _authorizationRepository = authorizationRepository;
        _functionalityRepository = functionalityRepository;
    }

    public void SaveAuthorization()
    {
        ActiveAuthorization activeAuthorization = _authorizationRepository.GetActiveAuthorizationFor(1);

        Functionality functionality1 = _functionalityRepository.GetFunctionalityFor("F1000");
        activeAuthorization.Draft.GrantPermissionTo(functionality1, 1);


        Functionality functionality3 = _functionalityRepository.GetFunctionalityFor("F3");
        activeAuthorization.Draft.GrantPermissionTo(functionality3, 4);

        _authorizationRepository.Save(activeAuthorization);
    }
}

//
// AuthorizationRepository
//
public class AuthorizationRepository : IAuthorizationRepository
{
  private readonly ISession _session;

    public AuthorizationRepository()
    {
        Configuration configuration = new Configuration();
        configuration.AddAssembly("NHibernateSpike");

        _session = configuration.BuildSessionFactory().OpenSession();
    }

    public ActiveAuthorization GetActiveAuthorizationFor(Int64 id)
    {
  return _session.Get<ActiveAuthorization>(id);
    }

    public void Save(ActiveAuthorization activeAuthorization)
    {
  _session.SaveOrUpdate(activeAuthorization);
  _session.Flush();
    }
}

//
// FunctionalityRepository
//
public class FunctionalityRepository : IFunctionalityRepository
{
    private readonly ISession _session;

    public FunctionalityRepository()
    {
        Configuration configuration = new Configuration();
        configuration.AddAssembly("NHibernateSpike");

        _session = configuration.BuildSessionFactory().OpenSession();
    }

    public Functionality GetFunctionalityFor(String code)
    {
        return _session.Get<Functionality>(code);
    }
}



Here is a piece from the log files:

Quote:
21:25:31.921 [11] DEBUG NHibernate.Impl.SessionImpl - executing flush
21:25:31.921 [11] DEBUG NHibernate.Impl.ConnectionManager - registering flush begin
21:25:31.937 [11] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Updating entity: [NHibernateSpike.Domain.Model.PermissionOnFunctionality#NHibernateSpike.Domain.Model.PermissionOnFunctionality]
21:25:31.937 [11] DEBUG NHibernate.Impl.BatcherImpl - Opened new IDbCommand, open IDbCommands: 1
21:25:31.937 [11] DEBUG NHibernate.Impl.BatcherImpl - Building an IDbCommand object for the SqlString: UPDATE PermissionOnFunctionality SET AccessCode = ? WHERE AuthorizationId = ? AND FunctionalityCode = ?
21:25:31.937 [11] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Dehydrating entity: [NHibernateSpike.Domain.Model.PermissionOnFunctionality#NHibernateSpike.Domain.Model.PermissionOnFunctionality]
21:25:31.937 [11] DEBUG NHibernate.Type.Int32Type - binding '1' to parameter: 0
21:25:31.952 [11] DEBUG NHibernate.Type.Int64Type - binding '2' to parameter: 1
21:25:31.952 [11] DEBUG NHibernate.Type.StringType - binding 'F3' to parameter: 2
21:25:31.952 [11] DEBUG NHibernate.SQL - UPDATE PermissionOnFunctionality SET AccessCode = @p0 WHERE AuthorizationId = @p1 AND FunctionalityCode = @p2; @p0 = '1', @p1 = '2', @p2 = 'F3'
21:25:31.952 [11] DEBUG NHibernate.Connection.DriverConnectionProvider - Obtaining IDbConnection from Driver
21:25:31.968 [11] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Updating entity: [NHibernateSpike.Domain.Model.PermissionOnFunctionality#NHibernateSpike.Domain.Model.PermissionOnFunctionality]
21:25:31.968 [11] DEBUG NHibernate.Impl.BatcherImpl - reusing command UPDATE PermissionOnFunctionality SET AccessCode = @p0 WHERE AuthorizationId = @p1 AND FunctionalityCode = @p2
21:25:31.968 [11] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Dehydrating entity: [NHibernateSpike.Domain.Model.PermissionOnFunctionality#NHibernateSpike.Domain.Model.PermissionOnFunctionality]
21:25:31.968 [11] DEBUG NHibernate.Type.Int32Type - binding '1' to parameter: 0
21:25:31.968 [11] DEBUG NHibernate.Type.Int64Type - binding '2' to parameter: 1
21:25:31.968 [11] DEBUG NHibernate.Engine.Cascades - unsaved-value strategy NULL
21:25:31.968 [11] DEBUG NHibernate.Type.StringType - binding 'F1000' to parameter: 2
21:25:31.968 [11] DEBUG NHibernate.SQL - UPDATE PermissionOnFunctionality SET AccessCode = @p0 WHERE AuthorizationId = @p1 AND FunctionalityCode = @p2; @p0 = '1', @p1 = '2', @p2 = 'F1000'
21:25:31.984 [11] DEBUG NHibernate.Impl.BatcherImpl - Closed IDbCommand, open IDbCommands: 0
21:25:31.984 [11] DEBUG NHibernate.Impl.ConnectionManager - skipping aggressive-release due to flush cycle
21:25:31.999 [11] ERROR NHibernate.Impl.SessionImpl - could not synchronize database state with session
NHibernate.StaleStateException: Unexpected row count: 0; expected: 1
at NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(Int32 rowCount, IDbCommand statement)
at NHibernate.Impl.NonBatchingBatcher.AddToBatch(IExpectation expectation)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, ISessionImplementor session)
at NHibernate.Impl.ScheduledUpdate.Execute()
at NHibernate.Impl.SessionImpl.Execute(IExecutable executable)
at NHibernate.Impl.SessionImpl.ExecuteAll(IList list)
at NHibernate.Impl.SessionImpl.Execute()
21:25:31.999 [11] DEBUG NHibernate.Impl.ConnectionManager - registering flush end
21:25:31.999 [11] DEBUG NHibernate.Impl.ConnectionManager - aggressively releasing database connection
21:25:31.999 [11] DEBUG NHibernate.Connection.ConnectionProvider - Closing connection


I'm using a SqLite database.

[code]CREATE TABLE [Authorization] (
[Id] INTEGER NULL,
[ExpirationDate] DATE NULL,
[Draft] INTEGER NULL
);

CREATE TABLE [Functionality] (
[code] VARCHAR(30) NOT NULL PRIMARY KEY
);

CREATE TABLE [PermissionOnFunctionality] (
[AuthorizationId] INTEGER NOT NULL,
[FunctionalityCode] VARCHAR(30) NULL,
[AccessCode] INTEGER NULL,
PRIMARY KEY ([AuthorizationId],[FunctionalityCode])
);[/code]

This is the SQL that gets generated:

Quote:
NHibernate: SELECT activeauth0_.Id as Id0_1_, activeauth0_.Draft as Draft0_1_, d
raftautho1_.Id as Id0_0_ FROM Authorization activeauth0_ left outer join Authori
zation draftautho1_ on activeauth0_.Draft=draftautho1_.Id WHERE activeauth0_.Id=
@p0; @p0 = '1'
NHibernate: SELECT permission0_.AuthorizationId as Authoriz1___1_, permission0_.
AuthorizationId as Authoriz1_1_, permission0_.FunctionalityCode as Function2_1_,
permission0_.AuthorizationId as Authoriz1_1_0_, permission0_.FunctionalityCode
as Function2_1_0_, permission0_.AccessCode as AccessCode1_0_ FROM PermissionOnFu
nctionality permission0_ WHERE permission0_.AuthorizationId=@p0; @p0 = '2'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F1'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F10'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F100'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F11'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F12'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F13'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F14'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F15'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F16'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F17'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F18'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F19'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F2'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F20'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F21'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F22'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F23'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F24'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F25'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F26'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F27'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F28'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F29'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F3'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F30'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F31'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F32'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F33'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F34'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F35'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F36'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F37'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F38'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F39'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F4'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F40'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F41'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F42'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F43'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F44'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F45'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F46'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F47'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F48'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F49'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F5'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F50'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F51'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F52'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F53'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F54'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F55'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F56'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F57'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F58'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F59'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F6'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F60'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F61'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F62'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F63'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F64'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F65'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F66'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F67'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F68'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F69'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F7'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F70'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F71'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F72'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F73'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F74'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F75'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F76'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F77'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F78'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F79'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F8'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F80'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F81'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F82'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F83'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F84'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F85'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F86'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F87'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F88'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F89'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F9'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F90'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F91'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F92'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F93'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F94'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F95'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F96'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F97'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F98'
NHibernate: SELECT functional0_.Code as Code2_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F99'
NHibernate: SELECT functional0_.Code as Code5_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F1000'
NHibernate: SELECT functional0_.Code as Code5_0_ FROM Functionality functional0_
WHERE functional0_.Code=@p0; @p0 = 'F3'
NHibernate: UPDATE PermissionOnFunctionality SET AccessCode = @p0 WHERE Authoriz
ationId = @p1 AND FunctionalityCode = @p2; @p0 = '1', @p1 = '2', @p2 = 'F3'
NHibernate: UPDATE PermissionOnFunctionality SET AccessCode = @p0 WHERE Authoriz
ationId = @p1 AND FunctionalityCode = @p2; @p0 = '1', @p1 = '2', @p2 = 'F1000'
NHibernate.StaleStateException: Unexpected row count: 0; expected: 1
at NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(In
t32 rowCount, IDbCommand statement)
at NHibernate.Impl.NonBatchingBatcher.AddToBatch(IExpectation expectation)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Obje
ct[] fields, Object[] oldFields, Boolean[] includeProperty, Int32 j, Object oldV
ersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Obje
ct[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields
, Object oldVersion, Object obj, ISessionImplementor session)
at NHibernate.Impl.ScheduledUpdate.Execute()
at NHibernate.Impl.SessionImpl.Execute(IExecutable executable)
at NHibernate.Impl.SessionImpl.ExecuteAll(IList list)
at NHibernate.Impl.SessionImpl.Execute()
at NHibernate.Impl.SessionImpl.Flush()
at NHibernateSpike.Infrastructure.Repositories.AuthorizationRepository.Save(A
ctiveAuthorization activeAuthorization) in c:\Te klasseren\NHibernateSpike\NHibe
rnateSpike\Infrastructure\Repositories\AuthorizationRepository.cs:line 29
at NHibernateSpike.Domain.Services.AuthorizationService.SaveAuthorization() i
n c:\Te klasseren\NHibernateSpike\NHibernateSpike\Domain\Services\AuthorizationS
ervice.cs:line 33
at NHibernateSpike.Program.Main() in c:\Te klasseren\NHibernateSpike\NHiberna
teSpike\Program.cs:line 18


I'm definitely doing something wrong here. It tries to perform an UPDATE while an INSERT is needed. Any suggestions? I'm definitely doing something wrong here :-).

Thanks in advance,

Jan


Top
 Profile  
 
 Post subject:
PostPosted: Tue Mar 18, 2008 3:32 am 
Expert
Expert

Joined: Thu Dec 14, 2006 5:57 am
Posts: 1185
Location: Zurich, Switzerland
Hibernate can't distinguish between new and updated PermissionOnFunctionality entities. After a short look on the code, you can use a generated id on the class instead of the composite id.
Another possibility would be implementing an IInterceptor.

_________________
--Wolfgang


Top
 Profile  
 
 Post subject:
PostPosted: Tue Mar 18, 2008 8:19 am 
Newbie

Joined: Mon Mar 17, 2008 3:36 pm
Posts: 4
Hi,

You're right! A generated id is the best solution (I always use this), but now I'm confronted with a legacy database. I solved this issue by adding a timestamp for PermissionOnFunctionality, which was already available in the database. (I used Sqlite for a quick spike, but I moved the configuration and mappings to the legacy DB).

This is my current mapping:

Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
   <class name="NHibernateSpike.Domain.Model.ActiveAuthorization, NHibernateSpike"
           table="AUT"
           lazy="false">
      <id name="Id" type="Int64" unsaved-value="-1" access="field.camelcase-underscore">
         <column name="AUTRID" sql-type="decimal" not-null="true" unique="true"/>
         <generator class="native"/>
      </id>
      <many-to-one name="Draft"
                     class="NHibernateSpike.Domain.Model.DraftAuthorization, NHibernateSpike"
                     column="PAUTRID"
                     access="field.camelcase-underscore"
                     cascade="all"/>
   </class>
   <class name="NHibernateSpike.Domain.Model.DraftAuthorization, NHibernateSpike"
           table="AUT"
           lazy="false">
      <id name="Id" type="Int64" unsaved-value="-1" access="field.camelcase-underscore">
         <column name="AUTRID" sql-type="decimal" not-null="true" unique="true"/>
         <generator class="native"/>
      </id>
      <set name="PermissionsOnFunctionality" access="field.camelcase-underscore"
          lazy="false" cascade="all-delete-orphan" inverse="true">
            <key column="AUTRID"/>
            <one-to-many class="NHibernateSpike.Domain.Model.PermissionOnFunctionality, NHibernateSpike"/>
        </set>
   </class>
   
   <class name="NHibernateSpike.Domain.Model.PermissionOnFunctionality, NHibernateSpike"
           table="FNCTLTAUT" lazy="false">
      <composite-id>
         <key-many-to-one name="DraftAuthorization" column="AUTRID" class="NHibernateSpike.Domain.Model.DraftAuthorization, NHibernateSpike" access="field.camelcase-underscore" lazy="false"/>
         <key-many-to-one name="Functionality" column="FNCNR" class="NHibernateSpike.Domain.Model.Functionality, NHibernateSpike" access="field.camelcase-underscore" lazy="false"/>
      </composite-id>
      <timestamp name="LastChange" column="TS"/>
      <property name="AccessCode" column="ACCS"  not-null="true"/>
   </class>
   
   <class name="NHibernateSpike.Domain.Model.Functionality, NHibernateSpike"
           table="FUNCT"
           lazy="false">
      <id name="Code" type="String" access="field.camelcase-underscore">
         <column name="FNCNR" sql-type="char" length="20" not-null="true" unique="true"/>
         <generator class="assigned"/>
      </id>
   </class>
</hibernate-mapping> 


Thanks for your response.

Grtz,

Jan


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.