From: <one...@us...> - 2003-01-25 01:26:11
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister In directory sc8-pr-cvs1:/tmp/cvs-serv30516/sf/hibernate/persister Modified Files: EntityPersister.java NormalizedEntityPersister.java Log Message: support for immutable properties and dynamic-update for <joined-subclass> mappings Index: EntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/EntityPersister.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** EntityPersister.java 25 Jan 2003 00:13:55 -0000 1.11 --- EntityPersister.java 25 Jan 2003 01:26:07 -0000 1.12 *************** *** 412,415 **** --- 412,416 ---- } + //TODO: precalculate this private boolean[] allProperties() { boolean[] result = new boolean[hydrateSpan]; *************** *** 560,564 **** if ( dirtyFields[j]==i ) dirty=true; } ! propsToUpdate[i] = ( dirty && getPropertyMutability()[i] ) || getVersionProperty()==i; } update(id, fields, propsToUpdate, oldVersion, object, generateUpdateString(propsToUpdate), session); --- 561,566 ---- if ( dirtyFields[j]==i ) dirty=true; } ! propsToUpdate[i] = dirty || getVersionProperty()==i; ! //don't need to check property mutability (dirty checking algorithm handles that) } update(id, fields, propsToUpdate, oldVersion, object, generateUpdateString(propsToUpdate), session); Index: NormalizedEntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/NormalizedEntityPersister.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** NormalizedEntityPersister.java 24 Jan 2003 13:07:17 -0000 1.3 --- NormalizedEntityPersister.java 25 Jan 2003 01:26:07 -0000 1.4 *************** *** 21,24 **** --- 21,25 ---- import java.sql.SQLException; import java.util.ArrayList; + import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; *************** *** 293,297 **** * Generate the SQL that updates a row by id (and version) */ ! protected String[] generateUpdateStrings() { String[] result = new String[ tableNames.length ]; for ( int j=0; j<tableNames.length; j++ ) { --- 294,298 ---- * Generate the SQL that updates a row by id (and version) */ ! protected String[] generateUpdateStrings(boolean[] includeProperty) { String[] result = new String[ tableNames.length ]; for ( int j=0; j<tableNames.length; j++ ) { *************** *** 302,306 **** boolean hasColumns = false; for (int i=0; i<propertyColumnNames.length; i++) { ! if ( propertyTables[i]==j ) { update.addColumns( propertyColumnNames[i] ); hasColumns = hasColumns || propertyColumnNames[i].length > 0; --- 303,307 ---- boolean hasColumns = false; for (int i=0; i<propertyColumnNames.length; i++) { ! if ( includeProperty[i] && propertyTables[i]==j ) { update.addColumns( propertyColumnNames[i] ); hasColumns = hasColumns || propertyColumnNames[i].length > 0; *************** *** 330,334 **** * Marshall the fields of a persistent instance to a prepared statement */ ! protected int dehydrate(Serializable id, Object[] fields, PreparedStatement[] statements, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id); --- 331,335 ---- * Marshall the fields of a persistent instance to a prepared statement */ ! protected int dehydrate(Serializable id, Object[] fields, boolean[] includeProperty, PreparedStatement[] statements, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id); *************** *** 337,341 **** for ( int i=0; i<tableNames.length; i++ ) { ! int index = dehydrate(id, fields, i, statements[i], session); if (i==0) versionParam = index; } --- 338,342 ---- for ( int i=0; i<tableNames.length; i++ ) { ! int index = dehydrate(id, fields, includeProperty, i, statements[i], session); if (i==0) versionParam = index; } *************** *** 345,349 **** } ! private int dehydrate(Serializable id, Object[] fields, int table, PreparedStatement statement, SessionImplementor session) throws SQLException, HibernateException { if (statement==null) return -1; --- 346,350 ---- } ! private int dehydrate(Serializable id, Object[] fields, boolean[] includeProperty, int table, PreparedStatement statement, SessionImplementor session) throws SQLException, HibernateException { if (statement==null) return -1; *************** *** 353,357 **** for (int j=0; j<hydrateSpan; j++) { ! if ( propertyTables[j]==table ) { getPropertyTypes()[j].nullSafeSet( statement, fields[j], index, session ); index += propertyColumnSpans[j]; --- 354,358 ---- for (int j=0; j<hydrateSpan; j++) { ! if ( includeProperty[j] && propertyTables[j]==table ) { getPropertyTypes()[j].nullSafeSet( statement, fields[j], index, session ); index += propertyColumnSpans[j]; *************** *** 424,427 **** --- 425,435 ---- } + //TODO: precalculate this + private boolean[] allProperties() { + boolean[] result = new boolean[hydrateSpan]; + Arrays.fill(result, true); + return result; + } + /** * Persist an object *************** *** 445,449 **** // insert was issued (cos of foreign key constraints). Not necessarily the object's current state ! dehydrate(id, fields, statements, session); for ( int i=0; i<tableNames.length; i++ ) statements[i].executeUpdate(); --- 453,457 ---- // insert was issued (cos of foreign key constraints). Not necessarily the object's current state ! dehydrate(id, fields, allProperties(), statements, session); for ( int i=0; i<tableNames.length; i++ ) statements[i].executeUpdate(); *************** *** 476,480 **** PreparedStatement statement = session.getBatcher().prepareStatement( sql[0] ); try { ! dehydrate(null, fields, 0, statement, session); statement.executeUpdate(); } --- 484,488 ---- PreparedStatement statement = session.getBatcher().prepareStatement( sql[0] ); try { ! dehydrate(null, fields, allProperties(), 0, statement, session); statement.executeUpdate(); } *************** *** 516,520 **** try { ! dehydrate(id, fields, i, statement, session); statement.executeUpdate(); } --- 524,528 ---- try { ! dehydrate(id, fields, allProperties(), i, statement, session); statement.executeUpdate(); } *************** *** 579,585 **** */ public void update(Serializable id, Object[] fields, int[] dirtyFields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException { ! ! int tables = tableNames.length; ! boolean[] tableUpdateNeeded; if (dirtyFields==null) { --- 587,591 ---- */ public void update(Serializable id, Object[] fields, int[] dirtyFields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException { ! boolean[] tableUpdateNeeded; if (dirtyFields==null) { *************** *** 587,591 **** } else { ! tableUpdateNeeded = new boolean[tables]; for ( int i=0; i<dirtyFields.length; i++ ) { tableUpdateNeeded[ propertyTables[ dirtyFields[i] ] ] = true; --- 593,597 ---- } else { ! tableUpdateNeeded = new boolean[tableNames.length]; for ( int i=0; i<dirtyFields.length; i++ ) { tableUpdateNeeded[ propertyTables[ dirtyFields[i] ] ] = true; *************** *** 593,596 **** --- 599,620 ---- if ( isVersioned() ) tableUpdateNeeded[0] = true; } + + if ( useDynamicUpdate() && dirtyFields!=null ) { + boolean[] propsToUpdate = new boolean[hydrateSpan]; + for ( int i=0; i<hydrateSpan; i++ ) { + boolean dirty=false; + for (int j=0; j<dirtyFields.length; j++) { + if ( dirtyFields[j]==i ) dirty=true; + } + propsToUpdate[i] = dirty || getVersionProperty()==i; + } + update(id, fields, propsToUpdate, tableUpdateNeeded, oldVersion, object, generateUpdateStrings(propsToUpdate), session); + } + else { + update(id, fields, getPropertyMutability(), tableUpdateNeeded, oldVersion, object, sqlUpdate(), session); + } + } + + protected void update(Serializable id, Object[] fields, boolean[] includeProperty, boolean[] includeTable, Object oldVersion, Object object, String[] sql, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) { *************** *** 599,615 **** } final PreparedStatement[] statements = new PreparedStatement[tables]; try { ! for ( int i=0; i<tableNames.length; i++ ) { ! if ( tableUpdateNeeded[i] ) statements[i] = session.getBatcher().prepareStatement( sqlUpdate()[i] ); } ! int versionParam = dehydrate(id, fields, statements, session); if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], oldVersion, versionParam, session ); for ( int i=0; i<tables; i++ ) { ! if ( tableUpdateNeeded[i] ) check( statements[i].executeUpdate(), id ); } --- 623,641 ---- } + int tables = tableNames.length; + final PreparedStatement[] statements = new PreparedStatement[tables]; try { ! for ( int i=0; i<tables; i++ ) { ! if ( includeTable[i] ) statements[i] = session.getBatcher().prepareStatement( sql[i] ); } ! int versionParam = dehydrate(id, fields, includeProperty, statements, session); if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], oldVersion, versionParam, session ); for ( int i=0; i<tables; i++ ) { ! if ( includeTable[i] ) check( statements[i].executeUpdate(), id ); } *************** *** 620,624 **** } finally { ! for ( int i=0; i<tableNames.length; i++ ) { if ( statements[i]!=null ) session.getBatcher().closeStatement( statements[i] ); } --- 646,650 ---- } finally { ! for ( int i=0; i<tables; i++ ) { if ( statements[i]!=null ) session.getBatcher().closeStatement( statements[i] ); } *************** *** 804,808 **** insertStrings = generateInsertStrings(false); identityInsertStrings = isIdentifierAssignedByInsert() ? generateInsertStrings(true) : null; ! updateStrings = generateUpdateStrings(); String lockString = generateLockString(); --- 830,834 ---- insertStrings = generateInsertStrings(false); identityInsertStrings = isIdentifierAssignedByInsert() ? generateInsertStrings(true) : null; ! updateStrings = generateUpdateStrings( getPropertyMutability() ); String lockString = generateLockString(); |