FileDocCategorySizeDatePackage
OnLockVisitor.javaAPI DocHibernate 3.2.52486Thu Dec 07 14:53:42 GMT 2006org.hibernate.event.def

OnLockVisitor

public class OnLockVisitor extends ReattachVisitor
When a transient entity is passed to lock(), we must inspect all its collections and 1. associate any uninitialized PersistentCollections with this session 2. associate any initialized PersistentCollections with this session, using the existing snapshot 3. throw an exception for each "new" collection
author
Gavin King

Fields Summary
Constructors Summary
public OnLockVisitor(org.hibernate.event.EventSource session, Serializable key, Object owner)

		super( session, key, owner );
	
Methods Summary
java.lang.ObjectprocessCollection(java.lang.Object collection, org.hibernate.type.CollectionType type)


		SessionImplementor session = getSession();
		CollectionPersister persister = session.getFactory().getCollectionPersister( type.getRole() );

		if ( collection == null ) {
			//do nothing
		}
		else if ( collection instanceof PersistentCollection ) {
			PersistentCollection persistentCollection = ( PersistentCollection ) collection;
			if ( persistentCollection.setCurrentSession( session ) ) {
				if ( isOwnerUnchanged( persistentCollection, persister, extractCollectionKeyFromOwner( persister ) ) ) {
					// a "detached" collection that originally belonged to the same entity
					if ( persistentCollection.isDirty() ) {
						throw new HibernateException( "reassociated object has dirty collection" );
					}
					reattachCollection( persistentCollection, type );
				}
				else {
					// a "detached" collection that belonged to a different entity
					throw new HibernateException( "reassociated object has dirty collection reference" );
				}
			}
			else {
				// a collection loaded in the current session
				// can not possibly be the collection belonging
				// to the entity passed to update()
				throw new HibernateException( "reassociated object has dirty collection reference" );
			}
		}
		else {
			// brand new collection
			//TODO: or an array!! we can't lock objects with arrays now??
			throw new HibernateException( "reassociated object has dirty collection reference (or an array)" );
		}

		return null;