⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wrapvisitor.java

📁 一个Java持久层类库
💻 JAVA
字号:
//$Id: WrapVisitor.java 7181 2005-06-17 19:36:08Z oneovthafew $package org.hibernate.event.def;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.hibernate.EntityMode;import org.hibernate.HibernateException;import org.hibernate.collection.PersistentCollection;import org.hibernate.engine.PersistenceContext;import org.hibernate.engine.SessionImplementor;import org.hibernate.event.EventSource;import org.hibernate.persister.collection.CollectionPersister;import org.hibernate.persister.entity.EntityPersister;import org.hibernate.type.AbstractComponentType;import org.hibernate.type.CollectionType;import org.hibernate.type.Type;/** * Wrap collections in a Hibernate collection * wrapper. * @author Gavin King */public class WrapVisitor extends ProxyVisitor {	private static final Logger log = LoggerFactory.getLogger(WrapVisitor.class);	boolean substitute = false;	boolean isSubstitutionRequired() {		return substitute;	}	WrapVisitor(EventSource session) {		super(session);	}	Object processCollection(Object collection, CollectionType collectionType)	throws HibernateException {		if ( collection!=null && (collection instanceof PersistentCollection) ) {			final SessionImplementor session = getSession();			PersistentCollection coll = (PersistentCollection) collection;			if ( coll.setCurrentSession(session) ) {				reattachCollection( coll, collectionType );			}			return null;		}		else {			return processArrayOrNewCollection(collection, collectionType);		}	}	final Object processArrayOrNewCollection(Object collection, CollectionType collectionType)	throws HibernateException {		final SessionImplementor session = getSession();		if (collection==null) {			//do nothing			return null;		}		else {			CollectionPersister persister = session.getFactory().getCollectionPersister( collectionType.getRole() );			final PersistenceContext persistenceContext = session.getPersistenceContext();			//TODO: move into collection type, so we can use polymorphism!			if ( collectionType.hasHolder( session.getEntityMode() ) ) {								if (collection==CollectionType.UNFETCHED_COLLECTION) return null;				PersistentCollection ah = persistenceContext.getCollectionHolder(collection);				if (ah==null) {					ah = collectionType.wrap(session, collection);					persistenceContext.addNewCollection( persister, ah );					persistenceContext.addCollectionHolder(ah);				}				return null;			}			else {				PersistentCollection persistentCollection = collectionType.wrap(session, collection);				persistenceContext.addNewCollection( persister, persistentCollection );				if ( log.isTraceEnabled() ) log.trace( "Wrapped collection in role: " + collectionType.getRole() );				return persistentCollection; //Force a substitution!			}		}	}	void processValue(int i, Object[] values, Type[] types) {		Object result = processValue( values[i], types[i] );		if (result!=null) {			substitute = true;			values[i] = result;		}	}	Object processComponent(Object component, AbstractComponentType componentType)	throws HibernateException {		if (component!=null) {			Object[] values = componentType.getPropertyValues( component, getSession() );			Type[] types = componentType.getSubtypes();			boolean substituteComponent = false;			for ( int i=0; i<types.length; i++ ) {				Object result = processValue( values[i], types[i] );				if (result!=null) {					values[i] = result;					substituteComponent = true;				}			}			if (substituteComponent) {				componentType.setPropertyValues( component, values, getSession().getEntityMode() );			}		}		return null;	}	void process(Object object, EntityPersister persister) throws HibernateException {		EntityMode entityMode = getSession().getEntityMode();		Object[] values = persister.getPropertyValues( object, entityMode );		Type[] types = persister.getPropertyTypes();		processEntityPropertyValues(values, types);		if ( isSubstitutionRequired() ) {			persister.setPropertyValues( object, values, entityMode );		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -