From: <one...@us...> - 2003-05-02 09:14:39
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection In directory sc8-pr-cvs1:/tmp/cvs-serv17954 Modified Files: ArrayHolder.java Bag.java CollectionPersister.java List.java Map.java PersistentCollection.java Set.java Added Files: IdentifierBag.java Log Message: added idbag and made some cleanups to collection fwk --- NEW FILE: IdentifierBag.java --- package net.sf.hibernate.collection; import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import net.sf.hibernate.HibernateException; import net.sf.hibernate.JDBCException; import net.sf.hibernate.engine.SessionImplementor; import net.sf.hibernate.type.Type; /** * An <tt>IdentifierBag</tt> implements "bag" semantics more efficiently than * a regular <tt>Bag</tt> by adding a synthetic identifier column to the * table. This identifier is unique for all rows in the table, allowing very * efficient updates and deletes. The value of the identifier is never exposed * to the application.<br> * <br> * <tt>IdentifierBag</tt>s may not be used for a many-to-one association. * Furthermore, there is no reason to use <tt>inverse="true"</tt>. * * @author Gavin King */ public class IdentifierBag extends ODMGCollection implements java.util.List { private java.util.List values; private java.util.Map identifiers; //element -> id public IdentifierBag(SessionImplementor session) { super(session); } public IdentifierBag(SessionImplementor session, java.util.Collection coll) { super(session); if (coll instanceof java.util.List) { values = (java.util.List) coll; } else { values = new ArrayList(); Iterator iter = coll.iterator(); while ( iter.hasNext() ) { values.add( iter.next() ); } } initialized = true; directlyAccessible = true; identifiers = new HashMap(); } public IdentifierBag(SessionImplementor session, CollectionPersister persister, Serializable disassembled, Object owner) throws HibernateException { super(session); beforeInitialize(persister); Serializable[] array = (Serializable[]) disassembled; for (int i=0; i<array.length; i+=2 ) { Object value = persister.getElementType().assemble( array[i+1], session, owner ); identifiers.put( value, persister.getIdentifierType().assemble( array[i], session, owner ) ); values.add(value); } initialized=true; } public boolean add(Object o) { write(); values.add(o); return true; } public void clear() { write(); values.clear(); identifiers.clear(); } public boolean contains(Object o) { read(); return values.contains(o); } public boolean containsAll(Collection c) { read(); return values.containsAll(c); } public boolean isEmpty() { read(); return values.isEmpty(); } public Iterator iterator() { read(); return values.iterator(); } public boolean remove(Object o) { write(); return values.remove(o); } public boolean removeAll(Collection c) { if ( c.size()>0 ) { write(); return values.removeAll(c); } else { return false; } } public boolean retainAll(Collection c) { write(); return values.retainAll(c); } public int size() { read(); return values.size(); } public Object[] toArray() { read(); return values.toArray(); } public Object[] toArray(Object[] a) { read(); return values.toArray(); } public void beforeInitialize(CollectionPersister persister) { identifiers = new HashMap(); values = new ArrayList(); } public Serializable disassemble(CollectionPersister persister) throws HibernateException { Serializable[] result = new Serializable[ values.size() * 2 ]; Iterator iter = values.iterator(); int i=0; while ( iter.hasNext() ) { Object value = iter.next(); result[i++] = persister.getIdentifierType().disassemble( identifiers.get(value), session); result[i++] = persister.getElementType().disassemble( value, session ); } return result; } public Iterator elements() { return values.iterator(); } public boolean empty() { return values.isEmpty(); } public Iterator entries() { return values.iterator(); } public boolean entryExists(Object entry, int i) { return entry!=null; } public boolean equalsSnapshot(Type elementType) throws HibernateException { java.util.Map snap = (java.util.Map) getSnapshot(); if ( snap.size()!= values.size() ) return false; Iterator iter = values.iterator(); int i=0; while ( iter.hasNext() ) { Object value = iter.next(); Object id = identifiers.get( new Integer(i++) ); if (id==null) return false; Object old = snap.get(id); if ( elementType.isDirty(old, value, session) ) return false; } return true; } public Iterator getDeletes(Type elemType) throws HibernateException { java.util.Map snap = (java.util.Map) getSnapshot(); java.util.List deletes = new ArrayList( snap.keySet() ); Iterator iter = values.iterator(); int i=0; while ( iter.hasNext() ) { if ( iter.next()!=null ) deletes.remove( identifiers.get( new Integer(i++) ) ); } return deletes.iterator(); } public Object getIndex(Object entry, int i) { throw new UnsupportedOperationException("Bags don't have indexes"); } public boolean needsInserting(Object entry, int i, Type elemType) throws HibernateException { java.util.Map snap = (java.util.Map) getSnapshot(); Object id = identifiers.get( new Integer(i) ); return entry!=null && ( id==null || snap.get(id)==null ); } public boolean needsUpdating(Object entry, int i, Type elemType) throws HibernateException { if (entry==null) return false; java.util.Map snap = (java.util.Map) getSnapshot(); Object id = identifiers.get( new Integer(i) ); if (id==null) return false; Object old = snap.get(id); return entry!=null && old!=null && elemType.isDirty(old, entry, session); } public Object readFrom( ResultSet rs, CollectionPersister persister, Object owner) throws HibernateException, SQLException { Object element = persister.readElement(rs, owner, session); values.add(element); identifiers.put( new Integer( values.size()-1), persister.readIdentifier(rs, session) ); return element; } protected Serializable snapshot(CollectionPersister persister) throws HibernateException { HashMap map = new HashMap( values.size() ); Iterator iter = values.iterator(); int i=0; while ( iter.hasNext() ) { Object value = iter.next(); map.put( identifiers.get( new Integer(i++) ), persister.getElementType().deepCopy(value) ); } return map; } public void preInsert(CollectionPersister persister, Object entry, int i) throws HibernateException { try { Serializable id = persister.getIdentifierGenerator().generate(session, entry); //TODO: native ids identifiers.put( new Integer(i), id ); } catch (SQLException sqle) { throw new JDBCException("could not generate collection row id", sqle); } } public void writeTo( PreparedStatement st, CollectionPersister persister, Object entry, int i, boolean writeOrder) throws HibernateException, SQLException { persister.writeElement(st, entry, writeOrder, session); persister.writeIdentifier(st, identifiers.get( new Integer(i) ), writeOrder, session); } public void add(int index, Object element) { write(); values.add(index, element); } public boolean addAll(int index, Collection c) { if ( c.size()>0 ) { write(); return values.addAll(index, c); } else { return false; } } public Object get(int index) { read(); return values.get(index); } public int indexOf(Object o) { read(); return values.indexOf(o); } public int lastIndexOf(Object o) { read(); return values.lastIndexOf(o); } public ListIterator listIterator() { read(); return values.listIterator(); } public ListIterator listIterator(int index) { read(); return values.listIterator(index); } public Object remove(int index) { write(); return values.remove(index); } public Object set(int index, Object element) { write(); return values.set(index, element); } public List subList(int fromIndex, int toIndex) { read(); return values.subList(fromIndex, toIndex); } public boolean addAll(Collection c) { if ( c.size()> 0 ) { write(); return values.addAll(c); } else { return false; } } } Index: ArrayHolder.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/ArrayHolder.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** ArrayHolder.java 25 Apr 2003 03:40:30 -0000 1.13 --- ArrayHolder.java 2 May 2003 09:14:29 -0000 1.14 *************** *** 73,89 **** /** - * @see PersistentCollection#replaceElements(Map) - */ - public void replaceElements(java.util.Map replacements) { - int size = Array.getLength(array); - for (int i=0; i<size; i++) { - Object val = Array.get(array, i); - Object r; - if ( val!=null && ( r=replacements.get(val) )!=null ) - Array.set(array, i, r); - } - } - - /** * @see PersistentCollection#elements() */ --- 73,76 ---- *************** *** 133,149 **** public Iterator entries() { return elements(); - } - - public void readEntries(Iterator entries) { - ArrayList list = new ArrayList(); - while ( entries.hasNext() ) { - list.add( entries.next() ); - } - array = Array.newInstance( elementClass, list.size() ); - entries = list.iterator(); - int i=0; - while ( entries.hasNext() ) { - Array.set( array, i++, entries.next() ); - } } --- 120,123 ---- Index: Bag.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/Bag.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** Bag.java 25 Apr 2003 03:40:30 -0000 1.12 --- Bag.java 2 May 2003 09:14:29 -0000 1.13 *************** *** 11,15 **** import java.util.List; import java.util.ListIterator; - import java.util.Map; import org.odmg.DBag; --- 11,14 ---- *************** *** 63,77 **** /** - * @see net.sf.hibernate.collections.PersistentCollection#replaceElements(Map) - */ - public void replaceElements(Map replacements) throws HibernateException { - for (int i=0; i<size(); i++) { - Object val = bag.get(i); - Object r; - if ( val!=null && ( r = replacements.get(val) )!=null ) bag.set(i, r); - } - } - - /** * @see net.sf.hibernate.collections.PersistentCollection#entries() */ --- 62,65 ---- *************** *** 80,91 **** } - /** - * @see net.sf.hibernate.collections.PersistentCollection#readEntries(Iterator) - */ - public void readEntries(Iterator entries) { - while ( entries.hasNext() ) { - bag.add( entries.next() ); - } - } /** --- 68,71 ---- *************** *** 276,279 **** --- 256,260 ---- */ public boolean addAll(Collection c) { + if ( c.size()==0 ) return false; if ( !queueAddAll(c) ) { write(); *************** *** 285,294 **** } /** * @see java.util.Collection#removeAll(Collection) */ public boolean removeAll(Collection c) { ! write(); ! return bag.removeAll(c); } --- 266,284 ---- } + public void delayedAddAll(Collection c) { + bag.addAll(c); + } + /** * @see java.util.Collection#removeAll(Collection) */ public boolean removeAll(Collection c) { ! if ( c.size()>0 ) { ! write(); ! return bag.removeAll(c); ! } ! else { ! return false; ! } } *************** *** 351,392 **** } - /*public boolean add(Object o, int n) { - if (n>0) write(); - for (int i=0; i<n; i++) { - add(o); - } - return n>0; - } - - public boolean remove(Object o, int n) { - if (n>0) write(); - for (int i=0; i<n; i++) { - remove(o); - } - return n>0; - } - - public Set uniqueSet() { - Set set = new HashSet( bag.size() ); - Iterator iter = bag.iterator(); - while ( iter.hasNext() ) { - set.add( iter.next() ); - } - return set; - } - - public int removeAllOccurences(Object o) { - write(); - Iterator iter = bag.iterator(); - int result=0; - while ( iter.hasNext() ) { - if ( o.equals( iter.next() ) ) { - result++; - iter.remove(); - } - } - return result; - }*/ - // List OPERATIONS: --- 341,344 ---- *************** *** 403,408 **** */ public boolean addAll(int i, Collection c) { ! write(); ! return bag.addAll(i, c); } --- 355,365 ---- */ public boolean addAll(int i, Collection c) { ! if ( c.size()>0 ) { ! write(); ! return bag.addAll(i, c); ! } ! else { ! return false; ! } } Index: CollectionPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/CollectionPersister.java,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** CollectionPersister.java 25 Apr 2003 03:40:30 -0000 1.21 --- CollectionPersister.java 2 May 2003 09:14:29 -0000 1.22 *************** *** 17,20 **** --- 17,21 ---- import net.sf.hibernate.engine.SessionFactoryImplementor; import net.sf.hibernate.engine.SessionImplementor; + import net.sf.hibernate.id.IdentifierGenerator; import net.sf.hibernate.loader.CollectionInitializer; import net.sf.hibernate.loader.CollectionLoader; *************** *** 23,26 **** --- 24,28 ---- import net.sf.hibernate.mapping.Collection; import net.sf.hibernate.mapping.Column; + import net.sf.hibernate.mapping.IdentifierCollection; import net.sf.hibernate.mapping.IndexedCollection; import net.sf.hibernate.mapping.PersistentClass; *************** *** 74,81 **** private final String[] unquotedIndexColumnNames; private final String[] unquotedElementColumnNames; ! private final String[] rowSelectColumnNames; private final String[] indexColumnAliases; private final String[] elementColumnAliases; ! private final Type rowSelectType; private final boolean primitiveArray; private final boolean array; --- 76,83 ---- private final String[] unquotedIndexColumnNames; private final String[] unquotedElementColumnNames; ! private String[] rowSelectColumnNames; //TODO: make final again private final String[] indexColumnAliases; private final String[] elementColumnAliases; ! private Type rowSelectType; //TODO: make final again private final boolean primitiveArray; private final boolean array; *************** *** 91,94 **** --- 93,102 ---- private final Class ownerClass; //private final boolean isSorted; + private final IdentifierGenerator identifierGenerator; + private final String unquotedIdentifierColumnName; + private final Type identifierType; + private final boolean hasIdentifier; + private final String identifierColumnName; + private final String identifierColumnAlias; private final CollectionInitializer loader; *************** *** 189,192 **** --- 197,220 ---- } + if ( hasIdentifier = collection.isIdentified() ) { + if (isOneToMany) throw new MappingException("one-to-many collections with identifiers are not supported"); + IdentifierCollection idColl = (IdentifierCollection) collection; + identifierType = idColl.getIdentifier().getType(); + iter = idColl.getIdentifier().getColumnIterator(); + identifierColumnName = ( (Column) iter.next() ).getName(); + rowSelectColumnNames = new String[] { identifierColumnName }; + rowSelectType = identifierType; + identifierColumnAlias = alias.toAliasString(identifierColumnName); + unquotedIdentifierColumnName = StringHelper.unQuote(identifierColumnAlias); + identifierGenerator = idColl.getIdentifier().createIdentifierGenerator( factory.getDialect() ); + } + else { + identifierType = null; + identifierColumnName = null; + identifierColumnAlias = null; + unquotedIdentifierColumnName = null; + identifierGenerator = null; + } + //sqlSelectString = sqlSelectString(); sqlDeleteString = generateDeleteString(); *************** *** 348,354 **** } public void writeElement(PreparedStatement st, Object elt, boolean writeOrder, SessionImplementor session) throws HibernateException, SQLException { ! getElementType().nullSafeSet(st, elt, 1+(writeOrder?0:keyColumnNames.length+(hasIndex?indexColumnNames.length:0)), session); } --- 376,393 ---- } + public Object readIdentifier(ResultSet rs, SessionImplementor session) throws HibernateException, SQLException { + Object id = getIdentifierType().nullSafeGet(rs, unquotedIdentifierColumnName, session, null); + if (id==null) throw new HibernateException("null identifier column for collection: " + role); + return id; + } + public void writeElement(PreparedStatement st, Object elt, boolean writeOrder, SessionImplementor session) throws HibernateException, SQLException { ! getElementType().nullSafeSet( ! st, ! elt, ! 1+(writeOrder?0:keyColumnNames.length+(hasIndex?indexColumnNames.length:0)+(hasIdentifier?1:0)), ! session ! ); } *************** *** 358,364 **** } private void writeRowSelect(PreparedStatement st, Object idx, SessionImplementor session) throws HibernateException, SQLException { ! rowSelectType.nullSafeSet(st, idx, 1+keyColumnNames.length, session); } --- 397,408 ---- } + public void writeIdentifier(PreparedStatement st, Object idx, boolean writeOrder, SessionImplementor session) + throws HibernateException, SQLException { + getIdentifierType().nullSafeSet(st, idx, 1+(writeOrder?elementColumnNames.length:keyColumnNames.length), session); + } + private void writeRowSelect(PreparedStatement st, Object idx, SessionImplementor session) throws HibernateException, SQLException { ! rowSelectType.nullSafeSet(st, idx, 1+(hasIdentifier?0:keyColumnNames.length), session); } *************** *** 385,388 **** --- 429,433 ---- .addColumns(alias, elementColumnNames, elementColumnAliases); if (hasIndex) frag.addColumns(alias, indexColumnNames, indexColumnAliases); + if (hasIdentifier) frag.addColumn(alias, identifierColumnName, identifierColumnAlias); return frag.toFragmentString() .substring(2); //strip leading ',' *************** *** 425,429 **** .setTableName(qualifiedTableName) .addColumns(keyColumnNames); ! if (hasIndex) update.addColumns(indexColumnNames); return update.setPrimaryKeyColumnNames(elementColumnNames) .toStatementString(); --- 470,475 ---- .setTableName(qualifiedTableName) .addColumns(keyColumnNames); ! if (hasIndex) update.addColumns(indexColumnNames); ! //identifier collections not supported for 1-to-many return update.setPrimaryKeyColumnNames(elementColumnNames) .toStatementString(); *************** *** 434,437 **** --- 480,484 ---- .addColumns(keyColumnNames); if (hasIndex) insert.addColumns(indexColumnNames); + if (hasIdentifier) insert.addColumn(identifierColumnName); return insert.addColumns(elementColumnNames) .toStatementString(); *************** *** 444,457 **** } else { ! return new Update() .setTableName(qualifiedTableName) ! .addColumns(elementColumnNames) ! .setPrimaryKeyColumnNames( ArrayHelper.join(keyColumnNames, rowSelectColumnNames) ) ! .toStatementString(); } } private String generateDeleteRowString() { ! String[] pkColumns = ArrayHelper.join(keyColumnNames, rowSelectColumnNames); if (isOneToMany) { Update update = new Update() --- 491,515 ---- } else { ! Update update = new Update() .setTableName(qualifiedTableName) ! .addColumns(elementColumnNames); ! if (hasIdentifier) { ! update.setPrimaryKeyColumnNames(rowSelectColumnNames); ! } ! else { ! update.setPrimaryKeyColumnNames( ArrayHelper.join(keyColumnNames, rowSelectColumnNames) ); ! } ! return update.toStatementString(); } } private String generateDeleteRowString() { ! final String[] pkColumns; ! if (hasIdentifier) { ! pkColumns = rowSelectColumnNames; ! } ! else { ! pkColumns = ArrayHelper.join(keyColumnNames, rowSelectColumnNames); ! } if (isOneToMany) { Update update = new Update() *************** *** 544,547 **** --- 602,606 ---- Object entry = entries.next(); if ( collection.entryExists(entry, i) ) { + collection.preInsert(this, entry, i); //TODO (Big): this here screws up batching! writeKey(st, id, false, session); collection.writeTo(st, this, entry, i, false); *************** *** 579,583 **** try { while ( entries.hasNext() ) { ! writeKey(st, id, false, session ); writeRowSelect( st, entries.next(), session ); session.getBatcher().addToBatch(-1); --- 638,642 ---- try { while ( entries.hasNext() ) { ! if (!hasIdentifier) writeKey(st, id, false, session ); writeRowSelect( st, entries.next(), session ); session.getBatcher().addToBatch(-1); *************** *** 607,611 **** if ( collection.needsUpdating(entry, i, elementType) ) { if (st==null) st = session.getBatcher().prepareBatchStatement( getSQLUpdateRowString() ); ! writeKey(st, id, true, session); collection.writeTo( st, this, entry, i, true ); session.getBatcher().addToBatch(1); --- 666,670 ---- if ( collection.needsUpdating(entry, i, elementType) ) { if (st==null) st = session.getBatcher().prepareBatchStatement( getSQLUpdateRowString() ); ! if (!hasIdentifier) writeKey(st, id, true, session); collection.writeTo( st, this, entry, i, true ); session.getBatcher().addToBatch(1); *************** *** 697,700 **** --- 756,760 ---- Object entry = entries.next(); if ( collection.needsInserting(entry, i, elementType) ) { + collection.preInsert(this, entry, i); //TODO (Big): this here screws up batching! if (st==null) st = session.getBatcher().prepareBatchStatement( getSQLInsertRowString() ); writeKey(st, id, false, session); *************** *** 731,734 **** --- 791,805 ---- }*/ + public IdentifierGenerator getIdentifierGenerator() { + return identifierGenerator; + } + + public Type getIdentifierType() { + return identifierType; + } + + public boolean hasIdentifier() { + return hasIdentifier; + } } Index: List.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/List.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** List.java 27 Apr 2003 07:04:30 -0000 1.13 --- List.java 2 May 2003 09:14:30 -0000 1.14 *************** *** 145,148 **** --- 145,149 ---- */ public boolean addAll(Collection c) { + if ( c.size()==0 ) return false; if ( !queueAddAll(c) ) { write(); *************** *** 154,163 **** } /** * @see List#addAll(int, Collection) */ ! public boolean addAll(int arg0, Collection arg1) { ! write(); ! return list.addAll( arg0, arg1); } --- 155,173 ---- } + public void delayedAddAll(Collection c) { + list.addAll(c); + } + /** * @see List#addAll(int, Collection) */ ! public boolean addAll(int index, Collection coll) { ! if ( coll.size()>0 ) { ! write(); ! return list.addAll(index, coll); ! } ! else { ! return false; ! } } *************** *** 165,171 **** * @see List#removeAll(Collection) */ ! public boolean removeAll(Collection arg0) { ! write(); ! return list.removeAll( arg0); } --- 175,186 ---- * @see List#removeAll(Collection) */ ! public boolean removeAll(Collection coll) { ! if ( coll.size()>0 ) { ! write(); ! return list.removeAll(coll); ! } ! else { ! return false; ! } } *************** *** 173,179 **** * @see List#retainAll(Collection) */ ! public boolean retainAll(Collection arg0) { write(); ! return list.retainAll( arg0); } --- 188,194 ---- * @see List#retainAll(Collection) */ ! public boolean retainAll(Collection coll) { write(); ! return list.retainAll(coll); } *************** *** 259,273 **** /** - * @see PersistentCollection#replaceElements(Map) - */ - public void replaceElements(java.util.Map replacements) { - for (int i=0; i<size(); i++) { - Object val = list.get(i); - Object r; - if ( val!=null && ( r = replacements.get(val) )!=null ) list.set(i, r); - } - } - - /** * @see PersistentCollection#elements() */ --- 274,277 ---- *************** *** 312,321 **** public Iterator entries() { return list.iterator(); - } - - public void readEntries(Iterator entries) { - while ( entries.hasNext() ) { - list.add( entries.next() ); - } } --- 316,319 ---- Index: Map.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/Map.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** Map.java 27 Apr 2003 07:04:30 -0000 1.13 --- Map.java 2 May 2003 09:14:30 -0000 1.14 *************** *** 125,131 **** * @see Map#putAll(Map) */ ! public void putAll(java.util.Map arg0) { ! write(); ! map.putAll(arg0); } --- 125,133 ---- * @see Map#putAll(Map) */ ! public void putAll(java.util.Map puts) { ! if ( map.size()>0 ) { ! write(); ! map.putAll(puts); ! } } *************** *** 163,182 **** /** - * @see PersistentCollection#replaceElements(Map) - */ - public void replaceElements(java.util.Map replacements) throws HibernateException { - Iterator iter = map.entrySet().iterator(); - int n=0; - while ( iter.hasNext() ) { - java.util.Map.Entry e = (java.util.Map.Entry) iter.next(); - Object val = e.getValue(); - Object r; - if ( val!=null && ( r=replacements.get(val) )!=null ) e.setValue(r); - n++; - } - if ( n!=replacements.size() ) throw new HibernateException("Application error: don't use mutable values for keys of maps"); - } - - /** * @see PersistentCollection#elements() */ --- 165,168 ---- *************** *** 219,229 **** } - public void readEntries(Iterator entries) { - while ( entries.hasNext() ) { - java.util.Map.Entry e = (java.util.Map.Entry) entries.next(); - map.put( e.getKey(), e.getValue() ); - } - } - /** a wrapper for Map.Entry sets */ class EntrySetProxy implements java.util.Set { --- 205,208 ---- *************** *** 320,324 **** for (int i=0; i<array.length; i+=2 ) map.put( persister.getIndexType().assemble( array[i], session, owner ), ! persister.getElementType().assemble( array[i+1], session, owner ) //TODO: fix the null!!!! ); initialized = true; --- 299,303 ---- for (int i=0; i<array.length; i+=2 ) map.put( persister.getIndexType().assemble( array[i], session, owner ), ! persister.getElementType().assemble( array[i+1], session, owner ) ); initialized = true; Index: PersistentCollection.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/PersistentCollection.java,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** PersistentCollection.java 25 Apr 2003 03:40:31 -0000 1.14 --- PersistentCollection.java 2 May 2003 09:14:30 -0000 1.15 *************** *** 61,66 **** public abstract boolean empty(); - public abstract void replaceElements(java.util.Map replacements) throws HibernateException; - public final void read() { initialize(false); --- 61,64 ---- *************** *** 110,114 **** } ! public boolean addAll(Collection coll) { throw new AssertionFailure("Collection does not support delayed initialization"); } --- 108,112 ---- } ! public void delayedAddAll(Collection coll) { throw new AssertionFailure("Collection does not support delayed initialization"); } *************** *** 148,152 **** //do this bit after setting initialized to true or it will recurse if (additions!=null) { ! addAll(additions); additions=null; } --- 146,150 ---- //do this bit after setting initialized to true or it will recurse if (additions!=null) { ! delayedAddAll(additions); additions=null; } *************** *** 195,199 **** public abstract Iterator entries(); - public abstract void readEntries(Iterator entries); public abstract Object readFrom(ResultSet rs, CollectionPersister role, Object owner) throws HibernateException, SQLException; public abstract void writeTo(PreparedStatement st, CollectionPersister role, Object entry, int i, boolean writeOrder) throws HibernateException, SQLException; --- 193,196 ---- *************** *** 566,569 **** --- 563,568 ---- this.collectionSnapshot = collectionSnapshot; } + + public void preInsert(CollectionPersister persister, Object entry, int i) throws HibernateException {} } Index: Set.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/collection/Set.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** Set.java 27 Apr 2003 07:04:30 -0000 1.13 --- Set.java 2 May 2003 09:14:30 -0000 1.14 *************** *** 6,10 **** import java.util.HashMap; import java.util.Iterator; - import java.util.Map; import java.util.HashSet; import java.io.Serializable; --- 6,9 ---- *************** *** 87,104 **** /** - * @see PersistentCollection#replaceElements(Map) - */ - public void replaceElements(Map replacements) throws HibernateException { - Iterator iter = replacements.entrySet().iterator(); - while ( iter.hasNext() ) { - java.util.Map.Entry e = (java.util.Map.Entry) iter.next(); - if ( !set.remove( e.getKey() ) ) { - throw new HibernateException("Application error: the hashcode of a mutable element of a set changed"); - } - set.add( e.getValue() ); - } - } - - /** * @see PersistentCollection#elements() */ --- 86,89 ---- *************** *** 185,191 **** * @see Set#addAll(Collection) */ ! public boolean addAll(Collection arg0) { ! write(); ! return set.addAll(arg0); } --- 170,181 ---- * @see Set#addAll(Collection) */ ! public boolean addAll(Collection coll) { ! if ( coll.size()> 0 ) { ! write(); ! return set.addAll(coll); ! } ! else { ! return false; ! } } *************** *** 201,207 **** * @see Set#removeAll(Collection) */ ! public boolean removeAll(Collection arg0) { ! write(); ! return set.remove(arg0); } --- 191,202 ---- * @see Set#removeAll(Collection) */ ! public boolean removeAll(Collection coll) { ! if ( coll.size()>0 ) { ! write(); ! return set.remove(coll); ! } ! else { ! return false; ! } } *************** *** 251,260 **** public Iterator entries() { return set.iterator(); - } - - public void readEntries(Iterator entries) { - while ( entries.hasNext() ) { - set.add( entries.next() ); - } } --- 246,249 ---- |