Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl
In directory usw-pr-cvs1:/tmp/cvs-serv30487/cirrus/hibernate/impl
Modified Files:
Tag: dynamic_update
ScheduledUpdate.java SessionImpl.java
Log Message:
dynamically generated update and insert SQL to:
* update only columns that changed
* insert only non-null values
Index: ScheduledUpdate.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl/ScheduledUpdate.java,v
retrieving revision 1.18
retrieving revision 1.18.2.1
diff -C2 -d -r1.18 -r1.18.2.1
*** ScheduledUpdate.java 1 Oct 2002 01:25:30 -0000 1.18
--- ScheduledUpdate.java 31 Oct 2002 08:36:17 -0000 1.18.2.1
***************
*** 14,27 ****
private final Object[] fields;
private final Object lastVersion;
! public ScheduledUpdate(Serializable id, Object[] fields, Object lastVersion, Object instance, ClassPersister persister, SessionImplementor session) {
super(session, id, instance, persister);
this.fields = fields;
this.lastVersion = lastVersion;
}
public void execute() throws SQLException, HibernateException {
if ( persister.hasCache() ) persister.getCache().lock(id);
! persister.update(id, fields, lastVersion, instance, session);
}
--- 14,29 ----
private final Object[] fields;
private final Object lastVersion;
+ private final boolean[] dirty;
! public ScheduledUpdate(Serializable id, Object[] fields, boolean[] dirty, Object lastVersion, Object instance, ClassPersister persister, SessionImplementor session) {
super(session, id, instance, persister);
this.fields = fields;
this.lastVersion = lastVersion;
+ this.dirty = dirty;
}
public void execute() throws SQLException, HibernateException {
if ( persister.hasCache() ) persister.getCache().lock(id);
! persister.update(id, fields, dirty, lastVersion, instance, session);
}
Index: SessionImpl.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl/SessionImpl.java,v
retrieving revision 1.144
retrieving revision 1.144.2.1
diff -C2 -d -r1.144 -r1.144.2.1
*** SessionImpl.java 29 Oct 2002 07:50:40 -0000 1.144
--- SessionImpl.java 31 Oct 2002 08:36:17 -0000 1.144.2.1
***************
*** 14,17 ****
--- 14,18 ----
import java.sql.Connection;
import java.sql.PreparedStatement;
+ import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
***************
*** 1785,1793 ****
boolean substitute = wrap(values, types); // substitutes into values by side-effect
// compare to cached state (ignoring nested collections)
if (
! /*( status==LOADED &&*/ entry.loadedState==null || // object loaded by update()
! persister.isDirty(values, entry.loadedState, object, this) ||
( status==LOADED && persister.isVersioned() && persister.hasCollections() && searchForDirtyCollections(values, types) )
) { // its dirty!
--- 1786,1799 ----
boolean substitute = wrap(values, types); // substitutes into values by side-effect
+
+ boolean cleanStateUnknown = entry.loadedState==null;
+
+ boolean[] dirtyFields = new boolean[types.length];
+ if (cleanStateUnknown) Arrays.fill(dirtyFields, true);
// compare to cached state (ignoring nested collections)
if (
! cleanStateUnknown || // object loaded by update()
! persister.isDirty(entry.loadedState, values, dirtyFields, object, this) ||
( status==LOADED && persister.isVersioned() && persister.hasCollections() && searchForDirtyCollections(values, types) )
) { // its dirty!
***************
*** 1819,1823 ****
updates.put(
new Key(entry.id, persister),
! new ScheduledUpdate( entry.id, values, entry.lastVersion, object, persister, this )
);
--- 1825,1829 ----
updates.put(
new Key(entry.id, persister),
! new ScheduledUpdate( entry.id, values, dirtyFields, entry.lastVersion, object, persister, this )
);
|