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

📄 entitybinder.java

📁 hibernate3.2.6源码和jar包
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
//$Id: EntityBinder.java 12910 2007-08-09 16:20:27Z epbernard $package org.hibernate.cfg.annotations;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import javax.persistence.Entity;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.PrimaryKeyJoinColumn;import javax.persistence.SecondaryTable;import javax.persistence.SecondaryTables;import javax.persistence.UniqueConstraint;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.hibernate.AnnotationException;import org.hibernate.AssertionFailure;import org.hibernate.EntityMode;import org.hibernate.MappingException;import org.hibernate.annotations.AccessType;import org.hibernate.annotations.BatchSize;import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;import org.hibernate.annotations.FetchMode;import org.hibernate.annotations.ForceDiscriminator;import org.hibernate.annotations.Immutable;import org.hibernate.annotations.Loader;import org.hibernate.annotations.OptimisticLockType;import org.hibernate.annotations.Persister;import org.hibernate.annotations.PolymorphismType;import org.hibernate.annotations.Proxy;import org.hibernate.annotations.SQLDelete;import org.hibernate.annotations.SQLDeleteAll;import org.hibernate.annotations.SQLInsert;import org.hibernate.annotations.SQLUpdate;import org.hibernate.annotations.Tables;import org.hibernate.annotations.Tuplizer;import org.hibernate.annotations.Tuplizers;import org.hibernate.annotations.Where;import org.hibernate.annotations.common.reflection.XAnnotatedElement;import org.hibernate.annotations.common.reflection.XClass;import org.hibernate.cache.CacheFactory;import org.hibernate.cfg.AnnotationBinder;import org.hibernate.cfg.BinderHelper;import org.hibernate.cfg.Ejb3JoinColumn;import org.hibernate.cfg.ExtendedMappings;import org.hibernate.cfg.InheritanceState;import org.hibernate.cfg.PropertyHolder;import org.hibernate.engine.ExecuteUpdateResultCheckStyle;import org.hibernate.engine.FilterDefinition;import org.hibernate.engine.Versioning;import org.hibernate.mapping.DependantValue;import org.hibernate.mapping.Join;import org.hibernate.mapping.PersistentClass;import org.hibernate.mapping.RootClass;import org.hibernate.mapping.SimpleValue;import org.hibernate.mapping.Table;import org.hibernate.mapping.TableOwner;import org.hibernate.mapping.Value;import org.hibernate.util.ReflectHelper;import org.hibernate.util.StringHelper;/** * Stateful holder and processor for binding Entity information * * @author Emmanuel Bernard */public class EntityBinder {	private String name;	private XClass annotatedClass;	private PersistentClass persistentClass;	private ExtendedMappings mappings;	private static Log log = LogFactory.getLog( EntityBinder.class );	private String discriminatorValue = "";	private boolean isPropertyAnnotated = false;	private boolean dynamicInsert;	private boolean dynamicUpdate;	private boolean explicitHibernateEntityAnnotation;	private OptimisticLockType optimisticLockType;	private PolymorphismType polymorphismType;	private boolean selectBeforeUpdate;	private int batchSize;	private boolean lazy;	private XClass proxyClass;	private String where;	private java.util.Map<String, Join> secondaryTables = new HashMap<String, Join>();	private java.util.Map<String, Object> secondaryTableJoins = new HashMap<String, Object>();	private String cacheConcurrentStrategy;	private String cacheRegion;	private java.util.Map<String, String> filters = new HashMap<String, String>();	private InheritanceState inheritanceState;	private boolean ignoreIdAnnotations;	private boolean cacheLazyProperty;	private String propertyAccessor;	public boolean isPropertyAnnotated() {		return isPropertyAnnotated;	}	/**	 * Use as a fake one for Collection of elements	 */	public EntityBinder() {	}	public EntityBinder(			Entity ejb3Ann, org.hibernate.annotations.Entity hibAnn,			XClass annotatedClass, PersistentClass persistentClass,			ExtendedMappings mappings	) {		this.mappings = mappings;		this.persistentClass = persistentClass;		this.annotatedClass = annotatedClass;		bindEjb3Annotation( ejb3Ann );		bindHibernateAnnotation( hibAnn );	}	private void bindHibernateAnnotation(org.hibernate.annotations.Entity hibAnn) {		if ( hibAnn != null ) {			dynamicInsert = hibAnn.dynamicInsert();			dynamicUpdate = hibAnn.dynamicUpdate();			optimisticLockType = hibAnn.optimisticLock();			selectBeforeUpdate = hibAnn.selectBeforeUpdate();			polymorphismType = hibAnn.polymorphism();			explicitHibernateEntityAnnotation = true;			//persister handled in bind		}		else {			//default values when the annotation is not there			dynamicInsert = false;			dynamicUpdate = false;			optimisticLockType = OptimisticLockType.VERSION;			polymorphismType = PolymorphismType.IMPLICIT;			selectBeforeUpdate = false;		}	}	private void bindEjb3Annotation(Entity ejb3Ann) {		if ( ejb3Ann == null ) throw new AssertionFailure( "@Entity should always be not null" );		if ( BinderHelper.isDefault( ejb3Ann.name() ) ) {			name = StringHelper.unqualify( annotatedClass.getName() );		}		else {			name = ejb3Ann.name();		}	}	public void setDiscriminatorValue(String discriminatorValue) {		this.discriminatorValue = discriminatorValue;	}	public void bindEntity() {		persistentClass.setAbstract( annotatedClass.isAbstract() );		persistentClass.setClassName( annotatedClass.getName() );		persistentClass.setNodeName( name );		//persistentClass.setDynamic(false); //no longer needed with the Entity name refactoring?		persistentClass.setEntityName( annotatedClass.getName() );		bindDiscriminatorValue();		persistentClass.setLazy( lazy );		if ( proxyClass != null ) {			persistentClass.setProxyInterfaceName( proxyClass.getName() );		}		persistentClass.setDynamicInsert( dynamicInsert );		persistentClass.setDynamicUpdate( dynamicUpdate );		if ( persistentClass instanceof RootClass ) {			RootClass rootClass = (RootClass) persistentClass;			boolean mutable = true;			//priority on @Immutable, then @Entity.mutable()			if ( annotatedClass.isAnnotationPresent( Immutable.class ) ) {				mutable = false;			}			else {				org.hibernate.annotations.Entity entityAnn =						annotatedClass.getAnnotation( org.hibernate.annotations.Entity.class );				if ( entityAnn != null ) {					mutable = entityAnn.mutable();				}			}			rootClass.setMutable( mutable );			rootClass.setExplicitPolymorphism( isExplicitPolymorphism( polymorphismType ) );			if ( StringHelper.isNotEmpty( where ) ) rootClass.setWhere( where );			if ( cacheConcurrentStrategy != null ) {				rootClass.setCacheConcurrencyStrategy( cacheConcurrentStrategy );				rootClass.setCacheRegionName( cacheRegion );				rootClass.setLazyPropertiesCacheable( cacheLazyProperty );			}			rootClass.setForceDiscriminator( annotatedClass.isAnnotationPresent( ForceDiscriminator.class ) );		}		else {			if ( explicitHibernateEntityAnnotation ) {				log.warn( "@org.hibernate.annotations.Entity used on a non root entity: ignored for "						+ annotatedClass.getName() );			}			if ( annotatedClass.isAnnotationPresent( Immutable.class ) ) {				log.warn( "@Immutable used on a non root entity: ignored for "						+ annotatedClass.getName() );			}		}		persistentClass.setOptimisticLockMode( getVersioning( optimisticLockType ) );		persistentClass.setSelectBeforeUpdate( selectBeforeUpdate );		//set persister if needed		//@Persister has precedence over @Entity.persister		Persister persisterAnn = annotatedClass.getAnnotation( Persister.class );		Class persister = null;		if ( persisterAnn != null ) {			persister = persisterAnn.impl();		}		else {			org.hibernate.annotations.Entity entityAnn = annotatedClass.getAnnotation( org.hibernate.annotations.Entity.class );			if ( entityAnn != null && !BinderHelper.isDefault( entityAnn.persister() ) ) {				try {					persister = ReflectHelper.classForName( entityAnn.persister() );				}				catch (ClassNotFoundException cnfe) {					throw new AnnotationException( "Could not find persister class: " + persister );				}			}		}		if ( persister != null ) persistentClass.setEntityPersisterClass( persister );		persistentClass.setBatchSize( batchSize );		//SQL overriding		SQLInsert sqlInsert = annotatedClass.getAnnotation( SQLInsert.class );		SQLUpdate sqlUpdate = annotatedClass.getAnnotation( SQLUpdate.class );		SQLDelete sqlDelete = annotatedClass.getAnnotation( SQLDelete.class );		SQLDeleteAll sqlDeleteAll = annotatedClass.getAnnotation( SQLDeleteAll.class );		Loader loader = annotatedClass.getAnnotation( Loader.class );		if ( sqlInsert != null ) {			persistentClass.setCustomSQLInsert( sqlInsert.sql().trim(), sqlInsert.callable(),					ExecuteUpdateResultCheckStyle.parse( sqlInsert.check().toString().toLowerCase() )			);		}		if ( sqlUpdate != null ) {			persistentClass.setCustomSQLUpdate( sqlUpdate.sql(), sqlUpdate.callable(),					ExecuteUpdateResultCheckStyle.parse( sqlUpdate.check().toString().toLowerCase() )			);		}		if ( sqlDelete != null ) {			persistentClass.setCustomSQLDelete( sqlDelete.sql(), sqlDelete.callable(),					ExecuteUpdateResultCheckStyle.parse( sqlDelete.check().toString().toLowerCase() )			);		}		if ( sqlDeleteAll != null ) {			persistentClass.setCustomSQLDelete( sqlDeleteAll.sql(), sqlDeleteAll.callable(),					ExecuteUpdateResultCheckStyle.parse( sqlDeleteAll.check().toString().toLowerCase() )			);		}		if ( loader != null ) {			persistentClass.setLoaderName( loader.namedQuery() );		}		//tuplizers		if ( annotatedClass.isAnnotationPresent( Tuplizers.class ) ) {			for (Tuplizer tuplizer : annotatedClass.getAnnotation( Tuplizers.class ).value()) {				EntityMode mode = EntityMode.parse( tuplizer.entityMode() );				persistentClass.addTuplizer( mode, tuplizer.impl().getName() );			}		}		if ( annotatedClass.isAnnotationPresent( Tuplizer.class ) ) {			Tuplizer tuplizer = annotatedClass.getAnnotation( Tuplizer.class );			EntityMode mode = EntityMode.parse( tuplizer.entityMode() );			persistentClass.addTuplizer( mode, tuplizer.impl().getName() );		}		if ( !inheritanceState.hasParents ) {			Iterator<Map.Entry<String, String>> iter = filters.entrySet().iterator();			while ( iter.hasNext() ) {				Map.Entry<String, String> filter = iter.next();				String filterName = filter.getKey();				String cond = filter.getValue();				if ( BinderHelper.isDefault( cond ) ) {					FilterDefinition definition = mappings.getFilterDefinition( filterName );					cond = definition == null ? null : definition.getDefaultFilterCondition();					if ( StringHelper.isEmpty( cond ) ) {						throw new AnnotationException(								"no filter condition found for filter " + filterName + " in " + this.name						);					}				}				persistentClass.addFilter( filterName, cond );			}		}		else {			if ( filters.size() > 0 ) {				log.warn( "@Filter not allowed on subclasses (ignored): " + persistentClass.getEntityName() );			}		}		log.debug( "Import with entity name=" + name );		try {			mappings.addImport( persistentClass.getEntityName(), name );			String entityName = persistentClass.getEntityName();			if ( !entityName.equals( name ) ) {				mappings.addImport( entityName, entityName );			}		}		catch (MappingException me) {			throw new AnnotationException( "Use of the same entity name twice: " + name, me );		}	}	public void bindDiscriminatorValue() {		if ( StringHelper.isEmpty( discriminatorValue ) ) {			Value discriminator = persistentClass.getDiscriminator();			if ( discriminator == null ) {				persistentClass.setDiscriminatorValue( name );			}			else if ( "character".equals( discriminator.getType().getName() ) ) {				throw new AnnotationException(						"Using default @DiscriminatorValue for a discriminator of type CHAR is not safe"				);			}			else if ( "integer".equals( discriminator.getType().getName() ) ) {				persistentClass.setDiscriminatorValue( String.valueOf( name.hashCode() ) );			}			else {				persistentClass.setDiscriminatorValue( name ); //Spec compliant			}		}		else {			//persistentClass.getDiscriminator()			persistentClass.setDiscriminatorValue( discriminatorValue );		}	}	int getVersioning(OptimisticLockType type) {		switch ( type ) {			case VERSION:				return Versioning.OPTIMISTIC_LOCK_VERSION;			case NONE:				return Versioning.OPTIMISTIC_LOCK_NONE;			case DIRTY:				return Versioning.OPTIMISTIC_LOCK_DIRTY;			case ALL:				return Versioning.OPTIMISTIC_LOCK_ALL;			default:				throw new AssertionFailure( "optimistic locking not supported: " + type );		}	}	private boolean isExplicitPolymorphism(PolymorphismType type) {		switch ( type ) {			case IMPLICIT:				return false;			case EXPLICIT:				return true;			default:				throw new AssertionFailure( "Unknown polymorphism type: " + type );		}	}	public void setBatchSize(BatchSize sizeAnn) {		if ( sizeAnn != null ) {			batchSize = sizeAnn.size();		}		else {			batchSize = -1;		}	}	public void setProxy(Proxy proxy) {		if ( proxy != null ) {			lazy = proxy.lazy();			if ( !lazy ) {				proxyClass = null;			}			else {				if ( AnnotationBinder.isDefault(						mappings.getReflectionManager().toXClass( proxy.proxyClass() ), mappings				) ) {					proxyClass = annotatedClass;				}				else {					proxyClass = mappings.getReflectionManager().toXClass( proxy.proxyClass() );				}			}		}		else {			lazy = true; //needed to allow association lazy loading.			proxyClass = annotatedClass;		}	}	public void setWhere(Where whereAnn) {		if ( whereAnn != null ) {			where = whereAnn.clause();		}	}	private String getClassTableName(String tableName) {		if ( StringHelper.isEmpty( tableName ) ) {			return mappings.getNamingStrategy().classToTableName( name );		}		else {			return mappings.getNamingStrategy().tableName( tableName );		}	}	public void bindTable(			String schema, String catalog,			String tableName, List uniqueConstraints,

⌨️ 快捷键说明

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