Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection In directory sc8-pr-cvs1:/tmp/cvs-serv25747/hibernate/collection Modified Files: ArrayHolder.java CollectionPersister.java PersistentCollection.java Set.java Log Message: * fixed a theoretical problem with caching and queued adds * fixed a real problem with sorted sets * re-enabled two-phase loading for sets Index: ArrayHolder.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/ArrayHolder.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** ArrayHolder.java 6 Mar 2003 11:12:08 -0000 1.10 --- ArrayHolder.java 2 Apr 2003 01:06:52 -0000 1.11 *************** *** 29,33 **** //just to help out during the load (ugly, i know) private transient Class elementClass; ! private transient java.util.List temp; public ArrayHolder(SessionImplementor session, Object array) { --- 29,33 ---- //just to help out during the load (ugly, i know) private transient Class elementClass; ! private transient java.util.List tempList; public ArrayHolder(SessionImplementor session, Object array) { *************** *** 38,45 **** public Serializable snapshot(CollectionPersister persister) throws HibernateException { ! int length = (array==null) ? temp.size() : Array.getLength(array); Serializable result = (Serializable) Array.newInstance( persister.getElementClass(), length ); for ( int i=0; i<length; i++ ) { ! Object elt = (array==null) ? temp.get(i) : Array.get(array, i); try { Array.set( result, i, persister.getElementType().deepCopy(elt) ); --- 38,45 ---- public Serializable snapshot(CollectionPersister persister) throws HibernateException { ! int length = /*(array==null) ? tempList.size() :*/ Array.getLength(array); Serializable result = (Serializable) Array.newInstance( persister.getElementClass(), length ); for ( int i=0; i<length; i++ ) { ! Object elt = /*(array==null) ? tempList.get(i) :*/ Array.get(array, i); try { Array.set( result, i, persister.getElementType().deepCopy(elt) ); *************** *** 87,91 **** */ public Iterator elements() { ! if (array==null) return temp.iterator(); int length = Array.getLength(array); java.util.List list = new ArrayList(length); --- 87,91 ---- */ public Iterator elements() { ! //if (array==null) return tempList.iterator(); int length = Array.getLength(array); java.util.List list = new ArrayList(length); *************** *** 115,126 **** throws HibernateException, SQLException { ! // relys on the fact that elements are returned sorted by index! Object element = persister.readElement(rs, owner, session); int index = ( (Integer) persister.readIndex(rs, session) ).intValue(); ! for ( int i = temp.size(); i<=index; i++) { ! temp.add(i, null); } ! temp.set(index, element); return element; } --- 115,126 ---- throws HibernateException, SQLException { ! // relies on the fact that elements are returned sorted by index! (obsolete comment, I think?) Object element = persister.readElement(rs, owner, session); int index = ( (Integer) persister.readIndex(rs, session) ).intValue(); ! for ( int i = tempList.size(); i<=index; i++) { ! tempList.add(i, null); } ! tempList.set(index, element); return element; } *************** *** 146,167 **** } //Arrays have to do things a bit differently. public Object getInitialValue(boolean lazy) throws SQLException, HibernateException { - - temp = new ArrayList(); super.getInitialValue(false); - array = Array.newInstance( elementClass, temp.size() ); - for ( int i=0; i<temp.size(); i++) { - Array.set(array, i, temp.get(i) ); - } - session.addArrayHolder(this); - temp=null; return array; } public void beforeInitialize(CollectionPersister persister) { ! //if (temp==null) throw new UnsupportedOperationException("Can't lazily initialize arrays"); } --- 146,170 ---- } + public void beginRead() { + tempList = new ArrayList(); + } + public void endRead() { + array = Array.newInstance( elementClass, tempList.size() ); + for ( int i=0; i<tempList.size(); i++) { + Array.set(array, i, tempList.get(i) ); + } + tempList=null; + } + //Arrays have to do things a bit differently. public Object getInitialValue(boolean lazy) throws SQLException, HibernateException { super.getInitialValue(false); session.addArrayHolder(this); return array; } public void beforeInitialize(CollectionPersister persister) { ! //if (tempList==null) throw new UnsupportedOperationException("Can't lazily initialize arrays"); } *************** *** 185,194 **** public Serializable disassemble(CollectionPersister persister) throws HibernateException { ! ! int length = temp.size(); Serializable[] result = new Serializable[length]; for ( int i=0; i<length; i++ ) { ! result[i] = persister.getElementType().disassemble( temp.get(i), session ); } return result; --- 188,203 ---- public Serializable disassemble(CollectionPersister persister) throws HibernateException { ! int length = Array.getLength(array); Serializable[] result = new Serializable[length]; for ( int i=0; i<length; i++ ) { ! result[i] = persister.getElementType().disassemble( Array.get(array,i), session ); } + + /*int length = tempList.size(); + Serializable[] result = new Serializable[length]; + for ( int i=0; i<length; i++ ) { + result[i] = persister.getElementType().disassemble( tempList.get(i), session ); + }*/ + return result; Index: CollectionPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/CollectionPersister.java,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** CollectionPersister.java 16 Mar 2003 01:45:52 -0000 1.16 --- CollectionPersister.java 2 Apr 2003 01:06:52 -0000 1.17 *************** *** 61,65 **** private final boolean hasOrder; private final boolean hasWhere; ! private final boolean isSet; private final Type keyType; private final Type indexType; --- 61,65 ---- private final boolean hasOrder; private final boolean hasWhere; ! //private final boolean isSet; private final Type keyType; private final Type indexType; *************** *** 86,89 **** --- 86,90 ---- private final int enableJoinedFetch; private final Class ownerClass; + //private final boolean isSorted; private final CollectionInitializer loader; *************** *** 119,123 **** } ! isSet = collection.isSet(); isOneToMany = collection.isOneToMany(); primitiveArray = collection.isPrimitiveArray(); --- 120,125 ---- } ! //isSet = collection.isSet(); ! //isSorted = collection.isSorted(); isOneToMany = collection.isOneToMany(); primitiveArray = collection.isPrimitiveArray(); *************** *** 689,699 **** } - public boolean isSet() { - return isSet; - } - public Class getOwnerClass() { return ownerClass; } } --- 691,705 ---- } public Class getOwnerClass() { return ownerClass; } + + /*public boolean isSet() { + return isSet; + } + + public boolean isSorted() { + return isSorted; + }*/ } Index: PersistentCollection.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/PersistentCollection.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** PersistentCollection.java 16 Mar 2003 01:45:52 -0000 1.10 --- PersistentCollection.java 2 Apr 2003 01:06:52 -0000 1.11 *************** *** 61,67 **** } protected final void write() { initialize(true); ! if ( session!=null && session.isOpen() ) { session.dirty(this); } --- 61,71 ---- } + private final boolean isConnectedToSession() { + return session!=null && session.isOpen(); + } + protected final void write() { initialize(true); ! if ( isConnectedToSession() ) { session.dirty(this); } *************** *** 72,76 **** private boolean mayQueueAdd() { ! return !initialized && session!=null && session.isOpen() && session.isCollectionReadOnly(this); } --- 76,82 ---- private boolean mayQueueAdd() { ! return !initialized && ! isConnectedToSession() && ! session.isInverseCollection(this); } *************** *** 79,82 **** --- 85,89 ---- if (additions==null) additions = new ArrayList(10); additions.add(element); + session.dirty(this); //needed so that we remove this collection from the JCS cache return true; } *************** *** 119,125 **** } public final void initialize(boolean writing) { if (!initialized) { ! if ( session!=null && session.isOpen() ) { try { session.initialize(this, writing); --- 126,140 ---- } + public void beginRead() { + // override on some subclasses + } + + public void endRead() { + //override on some subclasses + } + public final void initialize(boolean writing) { if (!initialized) { ! if ( isConnectedToSession() ) { try { session.initialize(this, writing); *************** *** 149,153 **** } else { ! if ( (this.session!=null) && this.session.isOpen() ) { throw new HibernateException("Illegal attempt to associate a collection with two open sessions"); } --- 164,168 ---- } else { ! if ( isConnectedToSession() ) { throw new HibernateException("Illegal attempt to associate a collection with two open sessions"); } Index: Set.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/Set.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** Set.java 6 Mar 2003 11:12:12 -0000 1.9 --- Set.java 2 Apr 2003 01:06:53 -0000 1.10 *************** *** 26,29 **** --- 26,30 ---- public class Set extends ODMGCollection implements java.util.Set, DSet { protected java.util.Set set; + private transient java.util.List tempList; public Serializable snapshot(CollectionPersister persister) throws HibernateException { *************** *** 228,233 **** public Object readFrom(ResultSet rs, CollectionPersister persister, Object owner) throws HibernateException, SQLException { Object element = persister.readElement(rs, owner, session); ! set.add(element); return element; } --- 229,243 ---- public Object readFrom(ResultSet rs, CollectionPersister persister, Object owner) throws HibernateException, SQLException { Object element = persister.readElement(rs, owner, session); ! tempList.add(element); return element; + } + + public void beginRead() { + tempList = new ArrayList(); + } + + public void endRead() { + set.addAll(tempList); + tempList = null; } |