<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Hibernate Type源碼解析

      type 的類圖

      1715157715830.png

      AssociationType: 關(guān)聯(lián)類型的 type,主要用于外鍵等相關(guān)

      IdentifierType: 主鍵相關(guān)的類型 type

      BasicType: 基礎(chǔ)類型,例如 long,int,string 等基礎(chǔ)類型

      type 注冊

      基礎(chǔ)類型的注冊器

      /*
       * Hibernate, Relational Persistence for Idiomatic Java
       *
       * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
       * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
       */
      package org.hibernate.type;
      
      import java.io.Serializable;
      import java.util.Map;
      import java.util.concurrent.ConcurrentHashMap;
      
      import org.hibernate.HibernateException;
      import org.hibernate.internal.CoreLogging;
      import org.hibernate.internal.CoreMessageLogger;
      import org.hibernate.type.spi.TypeConfiguration;
      import org.hibernate.usertype.CompositeUserType;
      import org.hibernate.usertype.UserType;
      
      /**
       * A registry of {@link BasicType} instances
       *
       * @author Steve Ebersole
       */
      public class BasicTypeRegistry implements Serializable {
      	private static final CoreMessageLogger LOG = CoreLogging.messageLogger( BasicTypeRegistry.class );
      
      	// TODO : analyze these sizing params; unfortunately this seems to be the only way to give a "concurrencyLevel"
      	// 使用 ConcurrentHashMap 保證線程安全
      	private Map<String, BasicType> registry = new ConcurrentHashMap<>( 100, .75f, 1 );
      	private boolean locked;
      	private TypeConfiguration typeConfiguration;
      
      	public BasicTypeRegistry(TypeConfiguration typeConfiguration){
      		this();
      		this.typeConfiguration = typeConfiguration;
      	}
      
          // 構(gòu)造方法,用于注冊各種對應(yīng)的基礎(chǔ)類型
      	public BasicTypeRegistry() {
      		register( BooleanType.INSTANCE );
      		register( NumericBooleanType.INSTANCE );
      		register( TrueFalseType.INSTANCE );
      		register( YesNoType.INSTANCE );
      
      		register( ByteType.INSTANCE );
      		register( CharacterType.INSTANCE );
      		register( ShortType.INSTANCE );
      		register( IntegerType.INSTANCE );
      		register( LongType.INSTANCE );
      		register( FloatType.INSTANCE );
      		register( DoubleType.INSTANCE );
      		register( BigDecimalType.INSTANCE );
      		register( BigIntegerType.INSTANCE );
      
      		register( StringType.INSTANCE );
      		register( StringNVarcharType.INSTANCE );
      		register( CharacterNCharType.INSTANCE );
      		register( UrlType.INSTANCE );
      
      		register( DurationType.INSTANCE );
      		register( InstantType.INSTANCE );
      		register( LocalDateTimeType.INSTANCE );
      		register( LocalDateType.INSTANCE );
      		register( LocalTimeType.INSTANCE );
      		register( OffsetDateTimeType.INSTANCE );
      		register( OffsetTimeType.INSTANCE );
      		register( ZonedDateTimeType.INSTANCE );
      
      		register( DateType.INSTANCE );
      		register( TimeType.INSTANCE );
      		register( TimestampType.INSTANCE );
      		register( DbTimestampType.INSTANCE );
      		register( CalendarType.INSTANCE );
      		register( CalendarDateType.INSTANCE );
      		register( CalendarTimeType.INSTANCE );
      
      		register( LocaleType.INSTANCE );
      		register( CurrencyType.INSTANCE );
      		register( TimeZoneType.INSTANCE );
      		register( ClassType.INSTANCE );
      		register( UUIDBinaryType.INSTANCE );
      		register( UUIDCharType.INSTANCE );
      
      		register( BinaryType.INSTANCE );
      		register( WrapperBinaryType.INSTANCE );
      		register( RowVersionType.INSTANCE );
      		register( ImageType.INSTANCE );
      		register( CharArrayType.INSTANCE );
      		register( CharacterArrayType.INSTANCE );
      		register( TextType.INSTANCE );
      		register( NTextType.INSTANCE );
      		register( BlobType.INSTANCE );
      		register( MaterializedBlobType.INSTANCE );
      		register( ClobType.INSTANCE );
      		register( NClobType.INSTANCE );
      		register( MaterializedClobType.INSTANCE );
      		register( MaterializedNClobType.INSTANCE );
      		register( SerializableType.INSTANCE );
      
      		register( ObjectType.INSTANCE );
      
      		//noinspection unchecked
      		register( new AdaptedImmutableType( DateType.INSTANCE ) );
      		//noinspection unchecked
      		register( new AdaptedImmutableType( TimeType.INSTANCE ) );
      		//noinspection unchecked
      		register( new AdaptedImmutableType( TimestampType.INSTANCE ) );
      		//noinspection unchecked
      		register( new AdaptedImmutableType( DbTimestampType.INSTANCE ) );
      		//noinspection unchecked
      		register( new AdaptedImmutableType( CalendarType.INSTANCE ) );
      		//noinspection unchecked
      		register( new AdaptedImmutableType( CalendarDateType.INSTANCE ) );
      		//noinspection unchecked
      		register( new AdaptedImmutableType( BinaryType.INSTANCE ) );
      		//noinspection unchecked
      		register( new AdaptedImmutableType( SerializableType.INSTANCE ) );
      	}
      
      	/**
      	 * Constructor version used during shallow copy
      	 *
      	 * @param registeredTypes The type map to copy over
      	 */
      	@SuppressWarnings({"UnusedDeclaration"})
      	private BasicTypeRegistry(Map<String, BasicType> registeredTypes) {
      		registry.putAll( registeredTypes );
      		locked = true;
      	}
      
          // 注冊對應(yīng)的基礎(chǔ)類型
      	public void register(BasicType type) {
      		register( type, type.getRegistrationKeys() );
      	}
      
          // 注冊對應(yīng)的基礎(chǔ)類型最終實現(xiàn)方法
      	public void register(BasicType type, String[] keys) {
      
      	    // 判斷是否加鎖
      		if ( locked ) {
      			throw new HibernateException( "Can not alter TypeRegistry at this time" );
      		}
      
              // 判斷 type 是否為空
      		if ( type == null ) {
      			throw new HibernateException( "Type to register cannot be null" );
      		}
      
      		if ( keys == null || keys.length == 0 ) {
      			LOG.typeDefinedNoRegistrationKeys( type );
      			return;
      		}
      
      		for ( String key : keys ) {
      			// be safe...
      			if ( key == null ) {
      				continue;
      			}
      			//Use String#intern here as there's high chances of duplicates combined with long term usage:
      			//just running our testsuite would generate 210,000 instances for the String "java.lang.Class" alone.
      			//Incidentally this might help with map lookup efficiency too.
      			key = key.intern();
      			LOG.debugf( "Adding type registration %s -> %s", key, type );
      			final Type old = registry.put( key, type );
      			if ( old != null && old != type ) {
      				LOG.typeRegistrationOverridesPrevious( key, old );
      			}
      		}
      	}
      
      	public void register(UserType type, String[] keys) {
      		register( new CustomType( type, keys ) );
      	}
      
      	public void register(CompositeUserType type, String[] keys) {
      		register( new CompositeCustomType( type, keys ) );
      	}
      
      	public void unregister(String... keys) {
      		for ( String key : keys ) {
      			registry.remove( key );
      		}
      	}
      
      	public BasicType getRegisteredType(String key) {
      		return registry.get( key );
      	}
      
      	public BasicTypeRegistry shallowCopy() {
      		return new BasicTypeRegistry( this.registry );
      	}
      }
      

      從 TypeFactory 中獲取 type

      /*
       * Hibernate, Relational Persistence for Idiomatic Java
       *
       * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
       * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
       */
      package org.hibernate.type;
      
      import java.io.Serializable;
      import java.util.Properties;
      
      import org.hibernate.MappingException;
      import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
      import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
      import org.hibernate.type.spi.TypeConfiguration;
      import org.hibernate.usertype.CompositeUserType;
      import org.hibernate.usertype.UserType;
      
      /**
       * Acts as the contract for getting types and as the mediator between {@link BasicTypeRegistry} and {@link TypeFactory}.
       *
       * @author Steve Ebersole
       *
       * @deprecated (since 5.3) No replacement, access to and handling of Types will be much different in 6.0
       */
      @Deprecated
      public class TypeResolver implements Serializable {
      	private final TypeFactory typeFactory;
      	private final TypeConfiguration typeConfiguration;
      
      	public TypeResolver(TypeConfiguration typeConfiguration, TypeFactory typeFactory){
      		this.typeConfiguration = typeConfiguration;
      		this.typeFactory = typeFactory;
      	}
      
      //	public TypeResolver() {
      //		this( new BasicTypeRegistry(), new TypeFactory() );
      //	}
      //
      //	/**
      //	 * @deprecated (since 5.3)
      //	 */
      //	@Deprecated
      //	public TypeResolver(BasicTypeRegistry basicTypeRegistry, TypeFactory typeFactory) {
      //		this.basicTypeRegistry = basicTypeRegistry;
      //		this.typeFactory = typeFactory;
      //	}
      
      //	public TypeResolver scope(SessionFactoryImplementor factory) {
      //		typeFactory.injectSessionFactory( factory );
      //		return new TypeResolver( basicTypeRegistry.shallowCopy(), typeFactory );
      //	}
      
      	public void registerTypeOverride(BasicType type) {
      		typeConfiguration.getBasicTypeRegistry().register( type );
      	}
      
      	public void registerTypeOverride(UserType type, String[] keys) {
      		typeConfiguration.getBasicTypeRegistry().register( type, keys );
      	}
      
      	public void registerTypeOverride(CompositeUserType type, String[] keys) {
      		typeConfiguration.getBasicTypeRegistry().register( type, keys );
      	}
      
      	public TypeFactory getTypeFactory() {
      		return typeFactory;
      	}
      
      	/**
      	 * Locate a Hibernate {@linkplain BasicType basic type} given (one of) its registration names.
      	 *
      	 * @param name The registration name
      	 *
      	 * @return The registered type
      	 */
      	public BasicType basic(String name) {
      		return typeConfiguration.getBasicTypeRegistry().getRegisteredType( name );
      	}
      
      	/**
      	 * See {@link #heuristicType(String, Properties)}
      	 *
      	 * @param typeName The name (see heuristic algorithm discussion on {@link #heuristicType(String, Properties)}).
      	 *
      	 * @return The deduced type; may be null.
      	 *
      	 * @throws MappingException Can be thrown from {@link #heuristicType(String, Properties)}
      	 */
      	public Type heuristicType(String typeName) throws MappingException {
      		return heuristicType( typeName, null );
      	}
      
      	/**
      	 * Uses heuristics to deduce the proper {@link Type} given a string naming the type or Java class.
      	 * <p/>
      	 * The search goes as follows:<ol>
      	 * 	<li>search for a basic type with 'typeName' as a registration key</li>
      	 * 	<li>
      	 * 		look for 'typeName' as a class name and<ol>
      	 *			<li>if it names a {@link Type} implementor, return an instance</li>
      	 *			<li>if it names a {@link CompositeUserType} or a {@link UserType}, return an instance of class wrapped into the appropriate {@link Type} adapter</li>
      	 * 			<li>if it implements {@link org.hibernate.classic.Lifecycle}, return the corresponding entity type</li>
      	 * 			<li>if it implements {@link Serializable}, return the corresponding serializable type</li>
      	 * 		</ol>
      	 * 	</li>
      	 * </ol>
      	 *
      	 * @param typeName The name (see heuristic algorithm above).
      	 * @param parameters Any parameters for the type.  Only applied if built!
      	 *
      	 * @return The deduced type; may be null.
      	 *
      	 * @throws MappingException Indicates a problem attempting to resolve 'typeName' as a {@link Class}
      	 */
      	 
      	 // 核心代碼
      	public Type heuristicType(String typeName, Properties parameters) throws MappingException {
      	    // 如果為 basicType,z則直接獲取
      		Type type = basic( typeName );
      		if ( type != null ) {
      			return type;
      		}
      
      		try {
      
      		    // 如果Basic中未獲取到,通過反射加載Type
      			final ClassLoaderService classLoaderService = typeConfiguration.getServiceRegistry().getService( ClassLoaderService.class );
      			Class typeClass = classLoaderService.classForName( typeName );
      			if ( typeClass != null ) {
      				return typeFactory.byClass( typeClass, parameters );
      			}
      		}
      		catch ( ClassLoadingException ignore ) {
      		}
      
      		return null;
      	}
      }
      
      posted @ 2024-07-12 10:33  booleandev  閱讀(33)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 免费吃奶摸下激烈视频| 亚洲Av综合日韩精品久久久| 亚洲色大成网站WWW久久| 日本边吃奶边摸边做在线视频| 4hu44四虎www在线影院麻豆| 高清自拍亚洲精品二区| 樱桃视频影院在线播放| 国产中文字幕在线一区| 黄色段片一区二区三区| 日本中文字幕有码在线视频| 久久精品国产中文字幕| 国产一区二区在线有码| 国产欧美精品一区aⅴ影院| 亚洲成aⅴ人在线电影| 久久热99这里只有精品| 无码专区视频精品老司机| 一本久久a久久精品综合| 久久精品国产福利一区二区 | 久久99精品久久久久久齐齐 | 亚洲精品香蕉一区二区| 成人av午夜在线观看| 无码日韩做暖暖大全免费不卡| 国产精品中文第一字幕| 成人亚欧欧美激情在线观看| 国产精品黑色丝袜在线观看| 国产一区精品在线免费看| 国产成人精品aa毛片| 在线精品另类自拍视频| 精品国产成人国产在线观看| 中国女人熟毛茸茸A毛片| 92国产精品午夜福利免费| 无码人妻斩一区二区三区| 国产h视频在线观看| 新乡市| 免费av深夜在线观看| 成在线人视频免费视频| 久久综合久中文字幕青草| 久久久久香蕉国产线看观看伊| 又色又爽又黄18禁美女裸身无遮挡| 在线观看亚洲欧美日本| 好先生在线观看免费播放|