type 的类图

AssociationType: 关联类型的 type,主要用于外键等相关

IdentifierType: 主键相关的类型 type

BasicType: 基础类型,例如 long,int,string 等基础类型

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.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;
} // 构造方法,用于注册各种对应的基础类型
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;
} // 注册对应的基础类型
public void register(BasicType type) {
register( type, type.getRegistrationKeys() );
} // 注册对应的基础类型最终实现方法
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;
}
}

Hibernate Type源码解析的更多相关文章

  1. hibernate部分源码解析and解决工作上关于hibernate的一个问题例子(包含oracle中新建表为何列名全转为大写且通过hibernate取数时如何不用再次遍历将列名(key)值转为小写)

    最近在研究系统启动时将数据加载到内存非常耗时,想着是否有办法优化!经过日志打印测试发现查询时间(查询时间:将数据库数据查询到系统中并转为List<Map>或List<*.Class& ...

  2. spring 源码解析

    1. [文件] spring源码.txt ~ 15B     下载(167) ? 1 springн┤┬вио╬Ш: 2. [文件] spring源码分析之AOP.txt ~ 15KB     下载( ...

  3. Mybaits 源码解析 (九)----- 全网最详细,没有之一:一级缓存和二级缓存源码分析

    像Mybatis.Hibernate这样的ORM框架,封装了JDBC的大部分操作,极大的简化了我们对数据库的操作. 在实际项目中,我们发现在一个事务中查询同样的语句两次的时候,第二次没有进行数据库查询 ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  5. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  6. Solr DIH JDBC 源码解析

    Solr DIH 源码解析 DataImportHandler.handleRequestBody()中的importer.runCmd(requestParams, sw) if (DataImpo ...

  7. EventBus源码解析 源码阅读记录

    EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...

  8. 实战录 | Kafka-0.10 Consumer源码解析

    <实战录>导语 前方高能!请注意本期攻城狮幽默细胞爆表,坐地铁的拉好把手,喝水的就建议暂时先别喝了:)本期分享人为云端卫士大数据工程师韩宝君,将带来Kafka-0.10 Consumer源 ...

  9. solr&lucene3.6.0源码解析(四)

    本文要描述的是solr的查询插件,该查询插件目的用于生成Lucene的查询Query,类似于查询条件表达式,与solr查询插件相关UML类图如下: 如果我们强行将上面的类图纳入某种设计模式语言的话,本 ...

  10. Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

    概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...

随机推荐

  1. LR梯度下降法MSE演练

    同步进行一波网上代码搬砖, 先来个入门的线性回归模型训练, 基于梯度下降法来, 优化用 MSE 来做. 理论部分就不讲了, 网上一大堆, 我自己也是理解好多年了, 什么 偏导数, 梯度(多远函数一阶偏 ...

  2. C++11 auto和decltype关键字

    今天来看下C++中的auto和decltype两个关键字 auto关键字定义变量,编译器会自动判断变量的类型 举个栗子: auto i =100; // i 是 int auto p = new A( ...

  3. demo阐述js中let和var 的不同

    当我们使用 var 和 let 来声明变量时,它们在作用域和变量提升方面的差异会产生一些不同的结果.下面是一个示例来说明这些差异. // 使用 var 声明变量 function varExample ...

  4. codeup之分数序列求和

    Description 有如下分数序列 求出次数列的前20项之和. 请将结果的数据类型定义为double类型. Input 无 Output 小数点后保留6位小数,末尾输出换行. Sample Inp ...

  5. python播放mp3最佳方法

    使用playsound库 1 from playsound import playsound 2 3 playsound('xx.mp3') 音质很好,就是只能播放mp3

  6. 乒乓球测距(K210)

    测距 说明 识别的物体是乒乓球(规格应该是统一的吧), 硬件是K210,测距的函数经过拟合,在50cm范围内是准确的 如果使用起来不准确,可以打印代码中的LM, 然后去测数据,自己再拟合一个函数,代替 ...

  7. springboot的jar包转war放入tomcat

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 1. 修改pom文件,打包形式改为war 2.移除内嵌的tomcat模块,但是为了在本机测试方便,我们还需要引入它,所以配置如下 3.修改启动 ...

  8. 「ABC 406 G」Travelling Salesman Problem

    「ABC 406 G」Travelling Salesman Problem 前言 本题笔者使用了两种方法来做,一是 \(\text{Slope trick}\) ,二是线段树,皆有讲解,各位读者按需 ...

  9. wso2~自定义id_token

    https://medium.com/@vinula9/scope-allowlisting-whitelisting-in-wso2-api-manager-for-generating-acces ...

  10. 在centos7等旧版linux上用国内源下载源码编译安装gcc并配置环境变量

    原文永久链接:https://forum.piwind.com/d/23-zai-centos7deng-jiu-ban-linuxshang-yong-guo-nei-yuan-xia-zai-yu ...