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

📄 annotationbinder.java

📁 hibernate3.2.6源码和jar包
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
			idGen.setName( tabGen.name() );			idGen.setIdentifierGeneratorStrategy( MultipleHiLoPerTableGenerator.class.getName() );			if ( !BinderHelper.isDefault( tabGen.table() ) ) {				idGen.addParam( MultipleHiLoPerTableGenerator.ID_TABLE, tabGen.table() );			}			if ( !BinderHelper.isDefault( tabGen.catalog() ) ) {				idGen.addParam( MultipleHiLoPerTableGenerator.CATALOG, tabGen.catalog() );			}			if ( !BinderHelper.isDefault( tabGen.schema() ) ) {				idGen.addParam( MultipleHiLoPerTableGenerator.SCHEMA, tabGen.schema() );			}			//FIXME implements uniqueconstrains			if ( !BinderHelper.isDefault( tabGen.pkColumnName() ) ) {				idGen.addParam( MultipleHiLoPerTableGenerator.PK_COLUMN_NAME, tabGen.pkColumnName() );			}			if ( !BinderHelper.isDefault( tabGen.valueColumnName() ) ) {				idGen.addParam( MultipleHiLoPerTableGenerator.VALUE_COLUMN_NAME, tabGen.valueColumnName() );			}			if ( !BinderHelper.isDefault( tabGen.pkColumnValue() ) ) {				idGen.addParam( MultipleHiLoPerTableGenerator.PK_VALUE_NAME, tabGen.pkColumnValue() );			}			idGen.addParam( TableHiLoGenerator.MAX_LO, String.valueOf( tabGen.allocationSize() - 1 ) );			log.debug( "Add table generator with name: " + idGen.getName() );		}		else if ( ann instanceof SequenceGenerator ) {			SequenceGenerator seqGen = (SequenceGenerator) ann;			idGen.setName( seqGen.name() );			idGen.setIdentifierGeneratorStrategy( "seqhilo" );			if ( !BinderHelper.isDefault( seqGen.sequenceName() ) ) {				idGen.addParam( org.hibernate.id.SequenceGenerator.SEQUENCE, seqGen.sequenceName() );			}			//FIXME: work on initialValue() through SequenceGenerator.PARAMETERS			if ( seqGen.initialValue() != 1 ) {				log.warn(						"Hibernate does not support SequenceGenerator.initialValue()"				);			}			idGen.addParam( SequenceHiLoGenerator.MAX_LO, String.valueOf( seqGen.allocationSize() - 1 ) );			log.debug( "Add sequence generator with name: " + idGen.getName() );		}		else if ( ann instanceof GenericGenerator ) {			GenericGenerator genGen = (GenericGenerator) ann;			idGen.setName( genGen.name() );			idGen.setIdentifierGeneratorStrategy( genGen.strategy() );			Parameter[] params = genGen.parameters();			for (Parameter parameter : params) {				idGen.addParam( parameter.name(), parameter.value() );			}			log.debug( "Add generic generator with name: " + idGen.getName() );		}		else {			throw new AssertionFailure( "Unknown Generator annotation: " + ann );		}		return idGen;	}	/**	 * Bind a class having JSR175 annotations	 * The subclasses <b>have to</b> be binded after its mother class	 */	public static void bindClass(			XClass clazzToProcess, Map<XClass, InheritanceState> inheritanceStatePerClass, ExtendedMappings mappings	) throws MappingException {		//TODO: be more strict with secondarytable allowance (not for ids, not for secondary table join columns etc)		InheritanceState inheritanceState = inheritanceStatePerClass.get( clazzToProcess );		AnnotatedClassType classType = mappings.getClassType( clazzToProcess );		if ( AnnotatedClassType.EMBEDDABLE_SUPERCLASS.equals( classType ) //will be processed by their subentities				|| AnnotatedClassType.NONE.equals( classType ) //to be ignored				|| AnnotatedClassType.EMBEDDABLE.equals( classType ) //allow embeddable element declaration				) {			if ( AnnotatedClassType.NONE.equals( classType )					&& clazzToProcess.isAnnotationPresent( org.hibernate.annotations.Entity.class ) ) {				log.warn( "Class annotated @org.hibernate.annotations.Entity but not javax.persistence.Entity "						+ "(most likely a user error): " + clazzToProcess.getName() );			}			return;		}		if ( !classType.equals( AnnotatedClassType.ENTITY ) ) {			//TODO make this test accurate by removing the none elements artifically added			throw new AnnotationException(					"Annotated class should have a @javax.persistence.Entity, @javax.persistence.Embeddable or @javax.persistence.EmbeddedSuperclass annotation: " + clazzToProcess							.getName()			);		}		XAnnotatedElement annotatedClass = clazzToProcess;		if ( log.isInfoEnabled() ) log.info( "Binding entity from annotated class: " + clazzToProcess.getName() );		InheritanceState superEntityState =				InheritanceState.getSuperEntityInheritanceState(						clazzToProcess, inheritanceStatePerClass, mappings.getReflectionManager()				);		PersistentClass superEntity = superEntityState != null ?				mappings.getClass(						superEntityState.clazz.getName()				) :				null;		if ( superEntity == null ) {			//check if superclass is not a potential persistent class			if ( inheritanceState.hasParents ) {				throw new AssertionFailure(						"Subclass has to be binded after it's mother class: "								+ superEntityState.clazz.getName()				);			}		}		bindQueries( annotatedClass, mappings );		bindFilterDefs( annotatedClass, mappings );		bindTypeDefs( annotatedClass, mappings );		BinderHelper.bindAnyMetaDefs( annotatedClass, mappings );		String schema = "";		String table = ""; //might be no @Table annotation on the annotated class		String catalog = "";		String discrimValue = null;		List<String[]> uniqueConstraints = new ArrayList<String[]>();		Ejb3DiscriminatorColumn discriminatorColumn = null;		Ejb3JoinColumn[] inheritanceJoinedColumns = null;		if ( annotatedClass.isAnnotationPresent( javax.persistence.Table.class ) ) {			javax.persistence.Table tabAnn = annotatedClass.getAnnotation( javax.persistence.Table.class );			table = tabAnn.name();			schema = tabAnn.schema();			catalog = tabAnn.catalog();			uniqueConstraints = TableBinder.buildUniqueConstraints( tabAnn.uniqueConstraints() );		}		final boolean hasJoinedColumns = inheritanceState.hasParents				&& InheritanceType.JOINED.equals( inheritanceState.type );		if ( hasJoinedColumns ) {			//@Inheritance(JOINED) subclass need to link back to the super entity			PrimaryKeyJoinColumns jcsAnn = annotatedClass.getAnnotation( PrimaryKeyJoinColumns.class );			boolean explicitInheritanceJoinedColumns = jcsAnn != null && jcsAnn.value().length != 0;			if ( explicitInheritanceJoinedColumns ) {				int nbrOfInhJoinedColumns = jcsAnn.value().length;				PrimaryKeyJoinColumn jcAnn;				inheritanceJoinedColumns = new Ejb3JoinColumn[nbrOfInhJoinedColumns];				for (int colIndex = 0; colIndex < nbrOfInhJoinedColumns; colIndex++) {					jcAnn = jcsAnn.value()[colIndex];					inheritanceJoinedColumns[colIndex] = Ejb3JoinColumn.buildJoinColumn(							jcAnn, null, superEntity.getIdentifier(),							(Map<String, Join>) null, (PropertyHolder) null, mappings					);				}			}			else {				PrimaryKeyJoinColumn jcAnn = annotatedClass.getAnnotation( PrimaryKeyJoinColumn.class );				inheritanceJoinedColumns = new Ejb3JoinColumn[1];				inheritanceJoinedColumns[0] = Ejb3JoinColumn.buildJoinColumn(						jcAnn, null, superEntity.getIdentifier(),						(Map<String, Join>) null, (PropertyHolder) null, mappings				);			}			log.debug( "Subclass joined column(s) created" );		}		else {			if ( annotatedClass.isAnnotationPresent( javax.persistence.PrimaryKeyJoinColumns.class )					|| annotatedClass.isAnnotationPresent( javax.persistence.PrimaryKeyJoinColumn.class ) ) {				log.warn( "Root entity should not hold an PrimaryKeyJoinColum(s), will be ignored" );			}		}		if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {			javax.persistence.DiscriminatorColumn discAnn = annotatedClass.getAnnotation(					javax.persistence.DiscriminatorColumn.class			);			DiscriminatorType discriminatorType = discAnn != null ?					discAnn.discriminatorType() :					DiscriminatorType.STRING;			org.hibernate.annotations.DiscriminatorFormula discFormulaAnn = annotatedClass.getAnnotation(					org.hibernate.annotations.DiscriminatorFormula.class			);			if ( !inheritanceState.hasParents ) {				discriminatorColumn = Ejb3DiscriminatorColumn.buildDiscriminatorColumn(						discriminatorType, discAnn, discFormulaAnn, mappings				);			}			if ( discAnn != null && inheritanceState.hasParents ) {				log.warn(						"Discriminator column has to be defined in the root entity, it will be ignored in subclass: "								+ clazzToProcess.getName()				);			}			discrimValue = annotatedClass.isAnnotationPresent( DiscriminatorValue.class ) ?					annotatedClass.getAnnotation( DiscriminatorValue.class ).value() :					null;		}		//we now know what kind of persistent entity it is		PersistentClass persistentClass;		//create persistent class		if ( !inheritanceState.hasParents ) {			persistentClass = new RootClass();		}		else if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {			persistentClass = new SingleTableSubclass( superEntity );		}		else if ( InheritanceType.JOINED.equals( inheritanceState.type ) ) {			persistentClass = new JoinedSubclass( superEntity );		}		else if ( InheritanceType.TABLE_PER_CLASS.equals( inheritanceState.type ) ) {			persistentClass = new UnionSubclass( superEntity );		}		else {			throw new AssertionFailure( "Unknown inheritance type: " + inheritanceState.type );		}		Proxy proxyAnn = annotatedClass.getAnnotation( Proxy.class );		BatchSize sizeAnn = annotatedClass.getAnnotation( BatchSize.class );		Where whereAnn = annotatedClass.getAnnotation( Where.class );		Entity entityAnn = annotatedClass.getAnnotation( Entity.class );		org.hibernate.annotations.Entity hibEntityAnn = annotatedClass.getAnnotation(				org.hibernate.annotations.Entity.class		);		org.hibernate.annotations.Cache cacheAnn = annotatedClass.getAnnotation(				org.hibernate.annotations.Cache.class		);		EntityBinder entityBinder = new EntityBinder(				entityAnn, hibEntityAnn, clazzToProcess, persistentClass, mappings		);		entityBinder.setDiscriminatorValue( discrimValue );		entityBinder.setBatchSize( sizeAnn );		entityBinder.setProxy( proxyAnn );		entityBinder.setWhere( whereAnn );		entityBinder.setCache( cacheAnn );		entityBinder.setInheritanceState( inheritanceState );		Filter filterAnn = annotatedClass.getAnnotation( Filter.class );		if ( filterAnn != null ) {			entityBinder.addFilter( filterAnn.name(), filterAnn.condition() );		}		Filters filtersAnn = annotatedClass.getAnnotation( Filters.class );		if ( filtersAnn != null ) {			for (Filter filter : filtersAnn.value()) {				entityBinder.addFilter( filter.name(), filter.condition() );			}		}		entityBinder.bindEntity();		if ( inheritanceState.hasTable() ) {			Check checkAnn = annotatedClass.getAnnotation( Check.class );			String constraints = checkAnn == null ?					null :					checkAnn.constraints();			entityBinder.bindTable(					schema, catalog, table, uniqueConstraints,					constraints, inheritanceState.hasDenormalizedTable() ?					superEntity.getTable() :					null			);		}		else {			if ( annotatedClass.isAnnotationPresent( Table.class ) ) {				log.warn( "Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: " + clazzToProcess						.getName() );			}		}//		Map<String, Column[]> columnOverride = PropertyHolderBuilder.buildHierarchyColumnOverride(//				clazzToProcess,//				persistentClass.getClassName()//		);		PropertyHolder propertyHolder = PropertyHolderBuilder.buildPropertyHolder(				clazzToProcess,				persistentClass,				entityBinder, mappings		);		javax.persistence.SecondaryTable secTabAnn = annotatedClass.getAnnotation(				javax.persistence.SecondaryTable.class		);		javax.persistence.SecondaryTables secTabsAnn = annotatedClass.getAnnotation(				javax.persistence.SecondaryTables.class		);		entityBinder.firstLevelSecondaryTablesBinding( secTabAnn, secTabsAnn );		OnDelete onDeleteAnn = annotatedClass.getAnnotation( OnDelete.class );		boolean onDeleteAppropriate = false;		if ( InheritanceType.JOINED.equals( inheritanceState.type ) && inheritanceState.hasParents ) {			onDeleteAppropriate = true;			final JoinedSubclass jsc = (JoinedSubclass) persistentClass;			if ( persistentClass.getEntityPersisterClass() == null ) {				persistentClass.getRootClass().setEntityPersisterClass( JoinedSubclassEntityPersister.class );			}			SimpleValue key = new DependantValue( jsc.getTable(), jsc.getIdentifier() );			jsc.setKey( key );			ForeignKey fk = annotatedClass.getAnnotation( ForeignKey.class );			if ( fk != null && !BinderHelper.isDefault( fk.name() ) ) {				key.setForeignKeyName( fk.name() );			}			if ( onDeleteAnn != null ) {				key.setCascadeDeleteEnabled( OnDeleteAction.CASCADE.equals( onDeleteAnn.action() ) );			}			else {				key.setCascadeDeleteEnabled( false );			}			//we are never in a second pass at that stage, so queue it			SecondPass sp = new JoinedSubclassFkSecondPass( jsc, inheritanceJoinedColumns, key, mappings );			mappings.addSecondPass( sp );			mappings.addSecondPass( new CreateKeySecondPass( jsc ) );		}		else if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {			if ( inheritanceState.hasParents ) {				if ( persistentClass.getEntityPersisterClass() == null ) {					persistentClass.getRootClass().setEntityPersisterClass( SingleTableEntityPersister.class );				}			}			else {				if ( inheritanceState.hasSons || !discriminatorColumn.isImplicit() ) {					//need a discriminator column					bindDiscriminatorToPersistentClass(							(RootClass) persistentClass,							discriminatorColumn,							entityBinder.getSecondaryTables(),							propertyHolder					);					entityBinder.bindDiscriminatorValue();//bind it again since the type might have changed				}			}		}		else if ( InheritanceType.TABLE_PER_CLASS.equals( inheritanceState.type ) ) {			if ( inheritanceState.hasParents ) {				if ( persistentClass.getEntityPersisterClass() == null ) {					persistentClass.getRootClass().setEntityPersisterClass( UnionSubclassEntityPersister.class );				}			}		}		if ( onDeleteAnn != null && !onDeleteAppropriate ) {			log.warn(					"Inapropriate use of @OnDelete on entity, annotation ignored: " + propertyHolder.getEntityName()

⌨️ 快捷键说明

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