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.  [ 1 post ] 
Author Message
 Post subject: NHibernate generates UPDATE sentence instead of INSERT!!!!!!
PostPosted: Sun Apr 08, 2007 1:46 pm 
Regular
Regular

Joined: Mon Oct 02, 2006 12:03 pm
Posts: 62
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


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

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.