Hello All,
It's the message log dumped for NHibernate -->
Quote:
Model.Customer{Id=2, Contacts=[ContactAddress#3], Bank_address=null, Name=Name{First_name=Jordi, Second_name=Cabré Roca}}
2007-04-08 19:29:28,908 [3256] DEBUG NHibernate.Impl.Printer - Model.ContactAddress{Id=3, ContactName=Name{First_name=ContactName, Second_name=secondContactName}, Street=La Parra, Number_street=15, City=Riudecols, State=Tarragona, Phone=97748584}
2007-04-08 19:29:28,908 [3256] DEBUG NHibernate.Impl.SessionImpl - executing flush
2007-04-08 19:29:28,908 [3256] DEBUG NHibernate.Impl.ConnectionManager - registering flush begin
2007-04-08 19:29:28,908 [3256] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Inserting entity: [Model.Customer#2]
2007-04-08 19:29:28,938 [3256] DEBUG NHibernate.Impl.BatcherImpl - Opened new IDbCommand, open IDbCommands: 1
2007-04-08 19:29:28,938 [3256] DEBUG NHibernate.Impl.BatcherImpl - Building an IDbCommand object for the SqlString: INSERT INTO CUSTOMER (FIRST_NAME, SECOND_NAME, BANK_ADDRESS, ID) VALUES (?, ?, ?, ?)
2007-04-08 19:29:28,938 [3256] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Dehydrating entity: [Model.Customer#2]
2007-04-08 19:29:28,938 [3256] DEBUG NHibernate.Type.StringType - binding 'Jordi' to parameter: 0
2007-04-08 19:29:28,938 [3256] DEBUG NHibernate.Type.StringType - binding 'Cabré Roca' to parameter: 1
2007-04-08 19:29:28,938 [3256] DEBUG NHibernate.Type.StringType - binding null to parameter: 2
2007-04-08 19:29:28,938 [3256] DEBUG NHibernate.Type.StringType - binding '2' to parameter: 3
2007-04-08 19:29:28,949 [3256] DEBUG NHibernate.SQL - INSERT INTO CUSTOMER (FIRST_NAME, SECOND_NAME, BANK_ADDRESS, ID) VALUES (@p0, @p1, @p2, @p3); @p0 = 'Jordi', @p1 = 'Cabré Roca', @p2 = '', @p3 = '2'
2007-04-08 19:29:28,949 [3256] DEBUG NHibernate.Connection.DriverConnectionProvider - Obtaining IDbConnection from Driver
2007-04-08 19:29:29,289 [3256] DEBUG NHibernate.Impl.BatcherImpl - Closed IDbCommand, open IDbCommands: 0
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Impl.ConnectionManager - skipping aggressive-release due to flush cycle
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Updating entity: [Model.ContactAddress#3]
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Impl.BatcherImpl - Opened new IDbCommand, open IDbCommands: 1
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Impl.BatcherImpl - Building an IDbCommand object for the SqlString: UPDATE ADDRESS SET STREET = ?, NUMBER_STREET = ?, CITY = ?, STATE = ? WHERE ID = ?
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Dehydrating entity: [Model.ContactAddress#3]
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Type.StringType - binding 'La Parra' to parameter: 0
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Type.StringType - binding '15' to parameter: 1
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Type.StringType - binding 'Riudecols' to parameter: 2
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Type.StringType - binding 'Tarragona' to parameter: 3
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.Type.StringType - binding '3' to parameter: 4
2007-04-08 19:29:29,299 [3256] DEBUG NHibernate.SQL - UPDATE ADDRESS SET STREET = @p0, NUMBER_STREET = @p1, CITY = @p2, STATE = @p3 WHERE ID = @p4; @p0 = 'La Parra', @p1 = '15', @p2 = 'Riudecols', @p3 = 'Tarragona', @p4 = '3'
2007-04-08 19:29:31,482 [3256] DEBUG NHibernate.Impl.BatcherImpl - Closed IDbCommand, open IDbCommands: 0
2007-04-08 19:29:31,482 [3256] DEBUG NHibernate.Impl.ConnectionManager - skipping aggressive-release due to flush cycle
2007-04-08 19:29:31,502 [3256] ERROR NHibernate.Impl.SessionImpl - could not synchronize database state with session
NHibernate.StaleStateException: Unexpected row count: 0; expected: 1
at NHibernate.AdoNet.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()
As you can see, I'm trying add a Customer into database. Customer has a ContactAddress Collection (Association).
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.Customer, ComponentsBroker" table="CUSTOMER">
<id name="Id" column="ID" type="String">
<generator class="assigned" />
</id>
<component class="Model.Name, ComponentsBroker" name="Name">
<property name="First_name" column="FIRST_NAME" type="String" />
<property name="Second_name" column="SECOND_NAME" type="String" />
</component>
<many-to-one name="Bank_address" class="Model.BankAddress, ComponentsBroker" unique="true" cascade="all"
column="BANK_ADDRESS" />
<set name="Contacts" table="CONTACT_ADDRESS" cascade="save-update">
<key foreign-key="CUSTOMER_ID" />
<one-to-many class="Model.ContactAddress, ComponentsBroker" />
</set>
</class>
</hibernate-mapping>
I've added cascade attribute="save-update" in order to forget to save each ContactAddress with code.
So, when I create a new customer and add a new ContactAddress, and execute save(customer) it should save Customer and ContactAddress, no?. So, NHibernate should create a INSERT INTO CUSTOMER( ....) and a INSERT INTO CONTACT_ADDRESS(...), But, NHibernate generates INSERT INTO CUSTOMER AND an UPDATE CONTACT_ADDRESS!!!! How on earth (excuse me) NHibernate can create a UPDATE CONTACT_ADDRESS SQL sentence (this contactAddress has never been saved previouly?
I understand nothing!! Can you help me? Why NHibernate tries update a contactAddress if it doesn't exist? Thanks for all.
Addresses mappings -->
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.Address, ComponentsBroker" table="ADDRESS">
<id name="Id" column="ID" type="String">
<generator class="assigned" />
</id>
<property name="Street" type="String" column="STREET"/>
<property name="Number_street" type="String" column="NUMBER_STREET"/>
<property name="City" type="String" column="CITY"/>
<property name="State" type="String" column="STATE"/>
<joined-subclass name="Model.BankAddress, ComponentsBroker" table="BANK_ADDRESS">
<key column="ADDRESS_ID"/>
<property name="BankName" type="String" column="BANK_NAME"/>
<property name="Account" type="String" column="ACCOUNT"/>
</joined-subclass>
<joined-subclass name="Model.ContactAddress, ComponentsBroker" table="CONTACT_ADDRESS">
<key column="ADDRESS_ID"/>
<component class="Model.Name, ComponentsBroker" name="ContactName">
<property name="First_name" column="FIRST_NAME" type="String"/>
<property name="Second_name" column="SECOND_NAME" type="String"/>
</component>
<property name="Phone" type="String" column="PHONE"/>
</joined-subclass>
</class>
</hibernate-mapping>
Main code in order to test it-->
Code:
Model.Customer customer = new Model.Customer("2", new Model.Name("Jordi", "Cabré Roca"));
customer.Contacts.Add(new Model.ContactAddress("3", "15", "La Parra", "Riudecols", "Tarragona", new Model.Name("ContactName", "secondContactName"), "97748584"));
broker.save(customer);
Save method -->
Code:
public void save(Model.Customer obj)
{
try
{
this.session.Save(obj);
this.session.Flush();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.InnerException.Message);
}
}
Note ex.Message -->
Quote:
Unexpected row count: 0; expected: 1