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] );
! }
}
|