-->
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.  [ 6 posts ] 
Author Message
 Post subject: Erroneous update
PostPosted: Tue Apr 13, 2004 10:15 am 
Senior
Senior

Joined: Sun Jan 04, 2004 2:46 pm
Posts: 147
I have a problem where an update is being generated when I'm doing a find().

Hibernate 2.1.1
SQLServer 2000

Debug level log

Code:
DEBUG [xxx.ServerConnectionManager] [User: quilleashm] (ServerConnectionManager.java:171) - Method request: ServerCore.executeHQL( java.lang.String:from CalculusToolbar c order by c.CtbIndex, java.lang.Integer:-1 )
DEBUG [xxx.ServerCore] [User: quilleashm] (ServerCore.java:192) - executeHQL(): from CalculusToolbar c order by c.CtbIndex
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:528) - opened session
DEBUG [net.sf.hibernate.transaction.JDBCTransaction] [User: quilleashm] (JDBCTransaction.java:37) - begin
DEBUG [net.sf.hibernate.transaction.JDBCTransaction] [User: quilleashm] (JDBCTransaction.java:41) - current autocommit status:false
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:1460) - find: from CalculusToolbar c order by c.CtbIndex
DEBUG [net.sf.hibernate.hql.QueryTranslator] [User: quilleashm] (QueryTranslator.java:147) - compiling query
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2193) - flushing session
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2321) - Flushing entities and processing referenced collections
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2664) - Processing unreferenced collections
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2678) - Scheduling collection removes/(re)creates/updates
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2217) - Flushed: 0 insertions, 0 updates, 0 deletions to 0 objects
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2222) - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:1745) - Dont need to execute flush
DEBUG [net.sf.hibernate.hql.QueryTranslator] [User: quilleashm] (QueryTranslator.java:199) - HQL: from xxx.database.hibernate.mappings.CalculusToolbar c order by c.CtbIndex
DEBUG [net.sf.hibernate.hql.QueryTranslator] [User: quilleashm] (QueryTranslator.java:200) - SQL: select calculusto0_.ctb_id as ctb_id, calculusto0_.ctb_version_id as ctb_vers2_, calculusto0_.ctb_created_dttm as ctb_crea3_, calculusto0_.ctb_created_csu_id as ctb_crea4_, calculusto0_.ctb_modified_dttm as ctb_modi5_, calculusto0_.ctb_modified_csu_id as ctb_modi6_, calculusto0_.ctb_delete_fl as ctb_dele7_, calculusto0_.ctb_name as ctb_name, calculusto0_.ctb_display_name as ctb_disp9_, calculusto0_.ctb_index as ctb_index, calculusto0_.ctb_icon_idx as ctb_ico11_ from calculus_toolbar calculusto0_ order by  calculusto0_.ctb_index
DEBUG [net.sf.hibernate.impl.BatcherImpl] [User: quilleashm] (BatcherImpl.java:192) - about to open: 0 open PreparedStatements, 0 open ResultSets
DEBUG [net.sf.hibernate.SQL] [User: quilleashm] (BatcherImpl.java:223) - select calculusto0_.ctb_id as ctb_id, calculusto0_.ctb_version_id as ctb_vers2_, calculusto0_.ctb_created_dttm as ctb_crea3_, calculusto0_.ctb_created_csu_id as ctb_crea4_, calculusto0_.ctb_modified_dttm as ctb_modi5_, calculusto0_.ctb_modified_csu_id as ctb_modi6_, calculusto0_.ctb_delete_fl as ctb_dele7_, calculusto0_.ctb_name as ctb_name, calculusto0_.ctb_display_name as ctb_disp9_, calculusto0_.ctb_index as ctb_index, calculusto0_.ctb_icon_idx as ctb_ico11_ from calculus_toolbar calculusto0_ order by  calculusto0_.ctb_index
Hibernate: select calculusto0_.ctb_id as ctb_id, calculusto0_.ctb_version_id as ctb_vers2_, calculusto0_.ctb_created_dttm as ctb_crea3_, calculusto0_.ctb_created_csu_id as ctb_crea4_, calculusto0_.ctb_modified_dttm as ctb_modi5_, calculusto0_.ctb_modified_csu_id as ctb_modi6_, calculusto0_.ctb_delete_fl as ctb_dele7_, calculusto0_.ctb_name as ctb_name, calculusto0_.ctb_display_name as ctb_disp9_, calculusto0_.ctb_index as ctb_index, calculusto0_.ctb_icon_idx as ctb_ico11_ from calculus_toolbar calculusto0_ order by  calculusto0_.ctb_index
DEBUG [net.sf.hibernate.impl.BatcherImpl] [User: quilleashm] (BatcherImpl.java:227) - preparing statement
DEBUG [net.sf.hibernate.loader.Loader] [User: quilleashm] (Loader.java:196) - processing result set
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:68) - returning '1' as column: ctb_id
DEBUG [net.sf.hibernate.loader.Loader] [User: quilleashm] (Loader.java:404) - result row: 1
DEBUG [net.sf.hibernate.loader.Loader] [User: quilleashm] (Loader.java:535) - Initializing object from ResultSet: 1
DEBUG [net.sf.hibernate.loader.Loader] [User: quilleashm] (Loader.java:604) - Hydrating entity: xxx.database.hibernate.mappings.CalculusToolbar#1
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:68) - returning '7' as column: ctb_vers2_
DEBUG [net.sf.hibernate.type.TimestampType] [User: quilleashm] (NullableType.java:68) - returning '01 January 2004 00:00:00' as column: ctb_crea3_
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:68) - returning '1' as column: ctb_crea4_
DEBUG [net.sf.hibernate.type.TimestampType] [User: quilleashm] (NullableType.java:68) - returning '13 April 2004 14:48:41' as column: ctb_modi5_
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:68) - returning '1' as column: ctb_modi6_
DEBUG [net.sf.hibernate.type.YesNoType] [User: quilleashm] (NullableType.java:68) - returning 'false' as column: ctb_dele7_
DEBUG [net.sf.hibernate.type.StringType] [User: quilleashm] (NullableType.java:68) - returning 'Search' as column: ctb_name
DEBUG [net.sf.hibernate.type.StringType] [User: quilleashm] (NullableType.java:68) - returning 'Search' as column: ctb_disp9_
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:68) - returning '0' as column: ctb_index
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:64) - returning null as column: ctb_ico11_
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:1837) - Version: 7
DEBUG [net.sf.hibernate.loader.Loader] [User: quilleashm] (Loader.java:225) - done processing result set (1 rows)
DEBUG [net.sf.hibernate.impl.BatcherImpl] [User: quilleashm] (BatcherImpl.java:199) - done closing: 0 open PreparedStatements, 0 open ResultSets
DEBUG [net.sf.hibernate.impl.BatcherImpl] [User: quilleashm] (BatcherImpl.java:240) - closing statement
DEBUG [net.sf.hibernate.loader.Loader] [User: quilleashm] (Loader.java:238) - total objects hydrated: 1
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2129) - resolving associations for [xxx.database.hibernate.mappings.CalculusToolbar#1]
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:3746) - collection not cached
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2153) - done materializing entity [xxx.database.hibernate.mappings.CalculusToolbar#1]
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:3000) - initializing non-lazy collections
DEBUG [net.sf.hibernate.transaction.JDBCTransaction] [User: quilleashm] (JDBCTransaction.java:59) - commit
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2193) - flushing session
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2321) - Flushing entities and processing referenced collections
DEBUG [net.sf.hibernate.persister.AbstractEntityPersister] [User: quilleashm] (AbstractEntityPersister.java:278) - xxx.database.hibernate.mappings.CalculusToolbar.CalculusToolbarItems is dirty
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2415) - Updating entity: [xxx.database.hibernate.mappings.CalculusToolbar#1]
DEBUG [net.sf.hibernate.persister.AbstractEntityPersister] [User: quilleashm] (AbstractEntityPersister.java:278) - xxx.database.hibernate.mappings.CalculusToolbar.ModifiedDttm is dirty
DEBUG [net.sf.hibernate.persister.AbstractEntityPersister] [User: quilleashm] (AbstractEntityPersister.java:278) - xxx.database.hibernate.mappings.CalculusToolbar.CalculusToolbarItems is dirty
DEBUG [net.sf.hibernate.engine.Versioning] [User: quilleashm] (Versioning.java:26) - Incrementing: 7 to 8
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2664) - Processing unreferenced collections
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2785) - Collection dereferenced: [xxx.database.hibernate.mappings.CalculusToolbar.CalculusToolbarItems#1]
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2678) - Scheduling collection removes/(re)creates/updates
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2217) - Flushed: 0 insertions, 1 updates, 0 deletions to 1 objects
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2222) - Flushed: 0 (re)creations, 0 updates, 1 removals to 1 collections
DEBUG [net.sf.hibernate.impl.Printer] [User: quilleashm] (Printer.java:75) - listing entities:
DEBUG [net.sf.hibernate.impl.Printer] [User: quilleashm] (Printer.java:82) - xxx.database.hibernate.mappings.CalculusToolbar{CtbIconIdx=-2147483648, ModifiedCsuId=1, ModifiedDttm=Tue Apr 13 14:56:36 BST 2004, CtbId=1, CtbDisplayName=Search, CtbName=Search, VersionId=8, DeleteFl=false, CtbIndex=0, CreatedDttm=Thu Jan 01 00:00:00 GMT 2004, CreatedCsuId=1, CalculusToolbarItems=null}
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2258) - executing flush
DEBUG [net.sf.hibernate.persister.EntityPersister] [User: quilleashm] (EntityPersister.java:631) - Updating entity: [xxx.database.hibernate.mappings.CalculusToolbar#1]
DEBUG [net.sf.hibernate.persister.EntityPersister] [User: quilleashm] (EntityPersister.java:632) - Existing version: 7 -> New version: 8
DEBUG [net.sf.hibernate.impl.BatcherImpl] [User: quilleashm] (BatcherImpl.java:192) - about to open: 0 open PreparedStatements, 0 open ResultSets
DEBUG [net.sf.hibernate.SQL] [User: quilleashm] (BatcherImpl.java:223) - update calculus_toolbar set ctb_version_id=?, ctb_modified_dttm=?, ctb_modified_csu_id=?, ctb_delete_fl=?, ctb_name=?, ctb_display_name=?, ctb_index=?, ctb_icon_idx=? where ctb_id=? and ctb_version_id=?
Hibernate: update calculus_toolbar set ctb_version_id=?, ctb_modified_dttm=?, ctb_modified_csu_id=?, ctb_delete_fl=?, ctb_name=?, ctb_display_name=?, ctb_index=?, ctb_icon_idx=? where ctb_id=? and ctb_version_id=?
DEBUG [net.sf.hibernate.impl.BatcherImpl] [User: quilleashm] (BatcherImpl.java:227) - preparing statement
DEBUG [net.sf.hibernate.persister.EntityPersister] [User: quilleashm] (EntityPersister.java:389) - Dehydrating entity: [xxx.database.hibernate.mappings.CalculusToolbar#1]
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:46) - binding '8' to parameter: 1
DEBUG [net.sf.hibernate.type.TimestampType] [User: quilleashm] (NullableType.java:46) - binding '13 April 2004 14:56:36' to parameter: 2
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:46) - binding '1' to parameter: 3
DEBUG [net.sf.hibernate.type.YesNoType] [User: quilleashm] (NullableType.java:46) - binding 'false' to parameter: 4
DEBUG [net.sf.hibernate.type.StringType] [User: quilleashm] (NullableType.java:46) - binding 'Search' to parameter: 5
DEBUG [net.sf.hibernate.type.StringType] [User: quilleashm] (NullableType.java:46) - binding 'Search' to parameter: 6
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:46) - binding '0' to parameter: 7
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:41) - binding null to parameter: 8
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:46) - binding '1' to parameter: 9
DEBUG [net.sf.hibernate.type.IntegerType] [User: quilleashm] (NullableType.java:46) - binding '7' to parameter: 10
DEBUG [net.sf.hibernate.impl.BatcherImpl] [User: quilleashm] (BatcherImpl.java:199) - done closing: 0 open PreparedStatements, 0 open ResultSets
DEBUG [net.sf.hibernate.impl.BatcherImpl] [User: quilleashm] (BatcherImpl.java:240) - closing statement
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:2708) - post flush
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:558) - transaction completion
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:546) - closing session
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:3187) - disconnecting session
DEBUG [net.sf.hibernate.impl.SessionImpl] [User: quilleashm] (SessionImpl.java:558) - transaction completion


Relevant mappings

Code:
  <class name="CalculusToolbar" table="calculus_toolbar" lazy="true" >

    <id name="CtbId" type="int" column="ctb_id" unsaved-value="null" >
      <generator class="assigned" />
    </id>
    <version name="VersionId" column="ctb_version_id" type="int" />

    <property name="CreatedDttm" column="ctb_created_dttm" type="com.anitecalculus.database.hibernate.type.DateTimeType" update="false" not-null="true" />
    <property name="CreatedCsuId" column="ctb_created_csu_id" type="int" update="false" not-null="true" />
    <property name="ModifiedDttm" column="ctb_modified_dttm" type="com.anitecalculus.database.hibernate.type.DateTimeType" not-null="true" />
    <property name="ModifiedCsuId" column="ctb_modified_csu_id" type="int" not-null="true" />
    <property name="DeleteFl" column="ctb_delete_fl" type="yes_no" not-null="true" />

    <property name="CtbName" column="ctb_name" type="string" not-null="true" />
    <property name="CtbDisplayName" column="ctb_display_name" type="string" not-null="true" />
    <property name="CtbIndex" column="ctb_index" type="int" not-null="true" />
    <property name="CtbIconIdx" column="ctb_icon_idx" type="com.anitecalculus.database.hibernate.type.NullIntType" not-null="false" />

    <set name="CalculusToolbarItems" lazy="true" inverse="true" >
      <key column="ctb_id"/>
      <one-to-many class="CalculusToolbarItem"/>
    </set>

  </class>

  <class name="CalculusToolbarItem" table="calculus_toolbar_item" lazy="true" >

    <id name="CtiId" type="int" column="cti_id" unsaved-value="null" >
      <generator class="assigned" />
    </id>
    <version name="VersionId" column="cti_version_id" type="int" />

    <property name="CreatedDttm" column="cti_created_dttm" type="com.anitecalculus.database.hibernate.type.DateTimeType" update="false" not-null="true" />
    <property name="CreatedCsuId" column="cti_created_csu_id" type="int" update="false" not-null="true" />
    <property name="ModifiedDttm" column="cti_modified_dttm" type="com.anitecalculus.database.hibernate.type.DateTimeType" not-null="true" />
    <property name="ModifiedCsuId" column="cti_modified_csu_id" type="int" not-null="true" />
    <property name="DeleteFl" column="cti_delete_fl" type="yes_no" not-null="true" />

    <property name="CsrId" column="csr_id" type="com.anitecalculus.database.hibernate.type.NullIntType" not-null="false" />
    <property name="CtbId" column="ctb_id" type="int" not-null="true" />
    <property name="CtiName" column="cti_name" type="string" not-null="true" />
    <property name="CtiDisplayName" column="cti_display_name" type="string" not-null="true" />
    <property name="CtiIndex" column="cti_index" type="int" not-null="true" />
    <property name="CtiIconIdx" column="cti_icon_idx" type="com.anitecalculus.database.hibernate.type.NullIntType" not-null="false" />

  </class>


And the Java code. Wrapped in an open session and transaction open then after a transaction commit and session close.

Code:
                // Run either the straight query or a row-limited one
                if (maxResultsF == -1)
                    return session.find(queryStringF);
                else
                {
                    Query q = session.createQuery(queryStringF);
                    q.setMaxResults(maxResultsF);
                    return q.list();
                }


The problem seems to be that somewhere along the way the CalculusToolbarItems set get's dirtied and causes the update. Is this supposed to happen or am I doing something wrong.

I am using an Interceptor to update Modified fields on each db row which also gets dirtied along the way because onFlushDirty gets called. I don't know whether this is contributing.

Any help appreciated.

Cheers.

Myk.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Apr 15, 2004 7:18 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
A find() triggers a flush of the Session, so all dirty objects get synchronized with the database. This is expected, required, and documented.

_________________
JAVA PERSISTENCE WITH HIBERNATE
http://jpwh.org
Get the book, training, and consulting for your Hibernate team.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 16, 2004 6:24 am 
Senior
Senior

Joined: Sun Jan 04, 2004 2:46 pm
Posts: 147
Yep I understand that but the code above is the only code executed between opening and closing the session.

Basically ignoring exceptions.

Code:
Session session = factory.open();
Transaction tx = session.beginTransaction();
session.find(...)
tx.commit();         // <<<< here it calls session.flush() which produces the update
session.close();


I'm not modifying or saving any objects in this session, just doing a single find(). Are there any circumstances that an update should be executed when only a find() is executed inside a session?

Cheers.

Myk.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 16, 2004 6:30 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
I think the UserType you are using is broken and says the value is dirty. Please read the log output carefully, you will see it. Also, your mapping shouldn't have "inverse=true" on the set.

_________________
JAVA PERSISTENCE WITH HIBERNATE
http://jpwh.org
Get the book, training, and consulting for your Hibernate team.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 16, 2004 2:23 pm 
Senior
Senior

Joined: Sun Jan 04, 2004 2:46 pm
Posts: 147
I nailed down the problem which was an error in my java file. specifically the getter for the Set object was returning null when it shouldn't be.

Thanks for the help.

Myk.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 16, 2004 2:29 pm 
Senior
Senior

Joined: Sun Jan 04, 2004 2:46 pm
Posts: 147
Incidentally should an inverse='true' collection's ( yes it is supposed to be like that ) value be taken into account when checking the dirtiness of an object?

The problem was manifesting inside hibernate when it compares the collection objects ( uses == ) and one returned from my broken class was null and the internally loadedState one was a proxy object of some sort? Should it even look at this when inverse='true'?

Cheers.

Myk.


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