From: <one...@us...> - 2002-10-31 08:36:21
|
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 ) ); |