Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister In directory usw-pr-cvs1:/tmp/cvs-serv20016/hibernate/persister Modified Files: AbstractEntityPersister.java ClassPersister.java EntityPersister.java MultiTableEntityPersister.java Log Message: for normalized table mappings, only update the tables that have dirty properties Index: AbstractEntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/AbstractEntityPersister.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** AbstractEntityPersister.java 31 Oct 2002 14:00:25 -0000 1.10 --- AbstractEntityPersister.java 5 Nov 2002 11:48:08 -0000 1.11 *************** *** 233,244 **** * Determine if the given field values are dirty */ ! public boolean isDirty(Object[] x, Object[] y, Object owner, SessionImplementor session) throws HibernateException { ! int prop = TypeFactory.findDirty( propertyTypes, x, y, owner, session.getFactory() ); ! if ( prop==-1) { ! return false; } else { ! if ( log.isTraceEnabled() ) log.trace( className + "."+ propertyNames[prop] + " is dirty" ); ! return true; } } --- 233,248 ---- * Determine if the given field values are dirty */ ! public int[] findDirty(Object[] x, Object[] y, Object owner, SessionImplementor session) throws HibernateException { ! int[] props = TypeFactory.findDirty( propertyTypes, x, y, owner, session.getFactory() ); ! if ( props==null) { ! return null; } else { ! if ( log.isTraceEnabled() ) { ! for ( int i=0; i<props.length; i++ ) { ! log.trace( className + '.'+ propertyNames[ props[i] ] + " is dirty" ); ! } ! } ! return props; } } Index: ClassPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/ClassPersister.java,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** ClassPersister.java 25 Oct 2002 18:26:11 -0000 1.18 --- ClassPersister.java 5 Nov 2002 11:48:08 -0000 1.19 *************** *** 140,145 **** /** * Compare two snapshots of the state of an instance to determine if the persistent state was modified */ ! public boolean isDirty(Object[] x, Object[] y, Object owner, SessionImplementor session) throws HibernateException; /** --- 140,146 ---- /** * Compare two snapshots of the state of an instance to determine if the persistent state was modified + * @return <tt>null</tt> or the indices of the dirty properties */ ! public int[] findDirty(Object[] x, Object[] y, Object owner, SessionImplementor session) throws HibernateException; /** *************** *** 221,225 **** * Update a persistent instance */ ! public void update(Serializable id, Object[] fields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException; /** --- 222,226 ---- * Update a persistent instance */ ! public void update(Serializable id, Object[] fields, int[] dirtyFields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException; /** Index: EntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/EntityPersister.java,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** EntityPersister.java 5 Nov 2002 10:42:52 -0000 1.37 --- EntityPersister.java 5 Nov 2002 11:48:08 -0000 1.38 *************** *** 628,632 **** * Update an object */ ! public void update(Serializable id, Object[] fields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) { --- 628,632 ---- * Update an object */ ! public void update(Serializable id, Object[] fields, int[] dirtyFields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) { Index: MultiTableEntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/MultiTableEntityPersister.java,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** MultiTableEntityPersister.java 5 Nov 2002 10:42:52 -0000 1.27 --- MultiTableEntityPersister.java 5 Nov 2002 11:48:08 -0000 1.28 *************** *** 25,28 **** --- 25,29 ---- import java.sql.SQLException; import java.util.ArrayList; + import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; *************** *** 527,530 **** --- 528,533 ---- private int dehydrate(Serializable id, Object[] fields, int table, PreparedStatement statement, SessionImplementor session) throws SQLException, HibernateException { + if (statement==null) return -1; + int index = 1; *************** *** 752,757 **** * Update an object */ ! public void update(Serializable id, Object[] fields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) { log.trace("Updating entity: " + getClassName() + '#' + id); --- 755,775 ---- * Update an object */ ! public void update(Serializable id, Object[] fields, int[] dirtyFields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException { ! ! if (!hasColumns) return; // for objects that came in via update() ! ! int tables = tableNames.length; + boolean[] tableUpdateNeeded = new boolean[tables]; + if (dirtyFields==null) { + Arrays.fill(tableUpdateNeeded, true); // for objects that came in via update() + } + else { + for ( int i=0; i<dirtyFields.length; i++ ) { + tableUpdateNeeded[ propertyTables[ dirtyFields[i] ] ] = true; + } + if ( isVersioned() ) tableUpdateNeeded[0] = true; + } + if ( log.isTraceEnabled() ) { log.trace("Updating entity: " + getClassName() + '#' + id); *************** *** 759,777 **** } - if (!hasColumns) return; - //Render the SQL query ! final PreparedStatement[] statements = new PreparedStatement[ tableNames.length ]; for ( int i=0; i<tableNames.length; i++ ) { ! statements[i] = session.getBatcher().prepareStatement( sqlUpdate()[i] ); } try { ! int versionParam = dehydrate(id, fields, statements, session); if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], oldVersion, versionParam, session ); ! for ( int i=0; i<tableNames.length; i++ ) check( statements[i].executeUpdate(), id ); --- 777,795 ---- } //Render the SQL query ! final PreparedStatement[] statements = new PreparedStatement[tables]; for ( int i=0; i<tableNames.length; i++ ) { ! if ( tableUpdateNeeded[i] ) statements[i] = session.getBatcher().prepareStatement( sqlUpdate()[i] ); } try { ! int versionParam = dehydrate(id, fields, statements, session); //TODO if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], oldVersion, versionParam, session ); ! for ( int i=0; i<tables; i++ ) { ! if ( tableUpdateNeeded[i] ) check( statements[i].executeUpdate(), id ); ! } *************** *** 782,786 **** } finally { ! for ( int i=0; i<tableNames.length; i++ ) session.getBatcher().closeStatement( statements[i] ); } --- 800,806 ---- } finally { ! for ( int i=0; i<tableNames.length; i++ ) { ! if ( tableUpdateNeeded[i] ) session.getBatcher().closeStatement( statements[i] ); ! } } |