📄 abstractpersistentcollection.java
字号:
public boolean isRowUpdatePossible() { return true; } /** * Does this instance have any "queued" additions? */ public final boolean hasQueuedOperations() { return operationQueue!=null; } /** * Iterate the "queued" additions */ public final Iterator queuedAdditionIterator() { if ( hasQueuedOperations() ) { return new Iterator() { int i = 0; public Object next() { return ( (DelayedOperation) operationQueue.get(i++) ).getAddedInstance(); } public boolean hasNext() { return i<operationQueue.size(); } public void remove() { throw new UnsupportedOperationException(); } }; } else { return EmptyIterator.INSTANCE; } } /** * Iterate the "queued" additions */ public final Collection getQueuedOrphans(String entityName) { if ( hasQueuedOperations() ) { Collection additions = new ArrayList( operationQueue.size() ); Collection removals = new ArrayList( operationQueue.size() ); for ( int i = 0; i < operationQueue.size(); i++ ) { DelayedOperation op = (DelayedOperation) operationQueue.get(i); additions.add( op.getAddedInstance() ); removals.add( op.getOrphan() ); } return getOrphans(removals, additions, entityName, session); } else { return CollectionHelper.EMPTY_COLLECTION; } } /** * Called before inserting rows, to ensure that any surrogate keys * are fully generated */ public void preInsert(CollectionPersister persister) throws HibernateException {} /** * Called after inserting a row, to fetch the natively generated id */ public void afterRowInsert(CollectionPersister persister, Object entry, int i) throws HibernateException {} /** * get all "orphaned" elements */ public abstract Collection getOrphans(Serializable snapshot, String entityName) throws HibernateException; /** * Get the current session */ public final SessionImplementor getSession() { return session; } final class IteratorProxy implements Iterator { private final Iterator iter; IteratorProxy(Iterator iter) { this.iter=iter; } public boolean hasNext() { return iter.hasNext(); } public Object next() { return iter.next(); } public void remove() { write(); iter.remove(); } } final class ListIteratorProxy implements ListIterator { private final ListIterator iter; ListIteratorProxy(ListIterator iter) { this.iter = iter; } public void add(Object o) { write(); iter.add(o); } public boolean hasNext() { return iter.hasNext(); } public boolean hasPrevious() { return iter.hasPrevious(); } public Object next() { return iter.next(); } public int nextIndex() { return iter.nextIndex(); } public Object previous() { return iter.previous(); } public int previousIndex() { return iter.previousIndex(); } public void remove() { write(); iter.remove(); } public void set(Object o) { write(); iter.set(o); } } class SetProxy implements java.util.Set { final Collection set; SetProxy(Collection set) { this.set=set; } public boolean add(Object o) { write(); return set.add(o); } public boolean addAll(Collection c) { write(); return set.addAll(c); } public void clear() { write(); set.clear(); } public boolean contains(Object o) { return set.contains(o); } public boolean containsAll(Collection c) { return set.containsAll(c); } public boolean isEmpty() { return set.isEmpty(); } public Iterator iterator() { return new IteratorProxy( set.iterator() ); } public boolean remove(Object o) { write(); return set.remove(o); } public boolean removeAll(Collection c) { write(); return set.removeAll(c); } public boolean retainAll(Collection c) { write(); return set.retainAll(c); } public int size() { return set.size(); } public Object[] toArray() { return set.toArray(); } public Object[] toArray(Object[] array) { return set.toArray(array); } } final class ListProxy implements java.util.List { private final java.util.List list; ListProxy(java.util.List list) { this.list = list; } public void add(int index, Object value) { write(); list.add(index, value); } /** * @see java.util.Collection#add(Object) */ public boolean add(Object o) { write(); return list.add(o); } /** * @see java.util.Collection#addAll(Collection) */ public boolean addAll(Collection c) { write(); return list.addAll(c); } /** * @see java.util.List#addAll(int, Collection) */ public boolean addAll(int i, Collection c) { write(); return list.addAll(i, c); } /** * @see java.util.Collection#clear() */ public void clear() { write(); list.clear(); } /** * @see java.util.Collection#contains(Object) */ public boolean contains(Object o) { return list.contains(o); } /** * @see java.util.Collection#containsAll(Collection) */ public boolean containsAll(Collection c) { return list.containsAll(c); } /** * @see java.util.List#get(int) */ public Object get(int i) { return list.get(i); } /** * @see java.util.List#indexOf(Object) */ public int indexOf(Object o) { return list.indexOf(o); } /** * @see java.util.Collection#isEmpty() */ public boolean isEmpty() { return list.isEmpty(); } /** * @see java.util.Collection#iterator() */ public Iterator iterator() { return new IteratorProxy( list.iterator() ); } /** * @see java.util.List#lastIndexOf(Object) */ public int lastIndexOf(Object o) { return list.lastIndexOf(o); } /** * @see java.util.List#listIterator() */ public ListIterator listIterator() { return new ListIteratorProxy( list.listIterator() ); } /** * @see java.util.List#listIterator(int) */ public ListIterator listIterator(int i) { return new ListIteratorProxy( list.listIterator(i) ); } /** * @see java.util.List#remove(int) */ public Object remove(int i) { write(); return list.remove(i); } /** * @see java.util.Collection#remove(Object) */ public boolean remove(Object o) { write(); return list.remove(o); } /** * @see java.util.Collection#removeAll(Collection) */ public boolean removeAll(Collection c) { write(); return list.removeAll(c); } /** * @see java.util.Collection#retainAll(Collection) */ public boolean retainAll(Collection c) { write(); return list.retainAll(c); } /** * @see java.util.List#set(int, Object) */ public Object set(int i, Object o) { write(); return list.set(i, o); } /** * @see java.util.Collection#size() */ public int size() { return list.size(); } /** * @see java.util.List#subList(int, int) */ public List subList(int i, int j) { return list.subList(i, j); } /** * @see java.util.Collection#toArray() */ public Object[] toArray() { return list.toArray(); } /** * @see java.util.Collection#toArray(Object[]) */ public Object[] toArray(Object[] array) { return list.toArray(array); } } protected interface DelayedOperation { public void operate(); public Object getAddedInstance(); public Object getOrphan(); } /** * Given a collection of entity instances that used to * belong to the collection, and a collection of instances * that currently belong, return a collection of orphans */ protected static Collection getOrphans( Collection oldElements, Collection currentElements, String entityName, SessionImplementor session) throws HibernateException { // short-circuit(s) if ( currentElements.size()==0 ) return oldElements; // no new elements, the old list contains only Orphans if ( oldElements.size()==0) return oldElements; // no old elements, so no Orphans neither Type idType = session.getFactory().getEntityPersister(entityName).getIdentifierType(); // create the collection holding the Orphans Collection res = new ArrayList(); // collect EntityIdentifier(s) of the *current* elements - add them into a HashSet for fast access java.util.Set currentIds = new HashSet(); for ( Iterator it=currentElements.iterator(); it.hasNext(); ) { Object current = it.next(); if ( current!=null && ForeignKeys.isNotTransient(entityName, current, null, session) ) { Serializable currentId = ForeignKeys.getEntityIdentifierIfNotUnsaved(entityName, current, session); currentIds.add( new TypedValue( idType, currentId, session.getEntityMode() ) ); } } // iterate over the *old* list for ( Iterator it=oldElements.iterator(); it.hasNext(); ) { Object old = it.next(); Serializable oldId = ForeignKeys.getEntityIdentifierIfNotUnsaved(entityName, old, session); if ( !currentIds.contains( new TypedValue( idType, oldId, session.getEntityMode() ) ) ) { res.add(old); } } return res; } static void identityRemove( Collection list, Object object, String entityName, SessionImplementor session) throws HibernateException { if ( object!=null && ForeignKeys.isNotTransient(entityName, object, null, session) ) { Type idType = session.getFactory().getEntityPersister(entityName).getIdentifierType(); Serializable idOfCurrent = ForeignKeys.getEntityIdentifierIfNotUnsaved(entityName, object, session); Iterator iter = list.iterator(); while ( iter.hasNext() ) { Serializable idOfOld = ForeignKeys.getEntityIdentifierIfNotUnsaved(entityName, iter.next(), session); if ( idType.isEqual( idOfCurrent, idOfOld, session.getEntityMode(), session.getFactory() ) ) { iter.remove(); break; } } } } public Object getIdentifier(Object entry, int i) { throw new UnsupportedOperationException(); } public Object getOwner() { return owner; } public void setOwner(Object owner) { this.owner = owner; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -