hibernate解析.docx
- 文档编号:1403155
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:21
- 大小:23.88KB
hibernate解析.docx
《hibernate解析.docx》由会员分享,可在线阅读,更多相关《hibernate解析.docx(21页珍藏版)》请在冰点文库上搜索。
hibernate解析
Hibernate源码解读
首先Configuration里:
newConfiguration()时创建SettingFactory调用有参的构造方法:
后直接reset();
Reset()方法:
第一件事就是初始化metadataSourceQueue
而类中hbmMetadatToEntityNamesMap和hbmMetadataByEntityNameXRef是做什么呢?
Environment里面是一些hibernate.hbm.xml中数据库的配置:
当调用configure()方法时,会默认调用configure(“/hibernate.cfg.xml”)方法。
在这里从resource如”hibernate.cfg.xml”文件中获取信息流.stream。
调用doConfigure(stream,resource)方法,返回一个Configuration对象。
进入doConfgure方法中:
通过xmlHelper.createSAXReader(resourceName,errors,entityResolver).read(newInputStource(stream));创建Document对象。
接着调用doConfiguration(Documentdoc):
Propertesproperty存储初始变量,获取了hibernate.porperty中的信息。
通过doConfiguration(Documentdoc)中的Property.setProperty(Environment.SESSION_FACTORY_NAME,name)加载了hibernate.cfg.xml中的session-factory的属性.
又通过addPoperty(Elementparent)来加载hibernate.cfg.xml中的property相关配置信息。
部分代码如下:
addProperties(Elementparent){
Iteratoritr=parent.elementIterator("property");
while(itr.hasNext()){
Elementnode=(Element)itr.next();
Stringname=node.attributeValue("name");
Stringvalue=node.getText().trim();
log.debug(name+"="+value);
properties.setProperty(name,value);
if(!
name.startsWith("hibernate")){
properties.setProperty("hibernate."+name,value);
}
}
Environment.verifyProperties(properties);
}
///为什么会用verifyProperty()方法不太明白
这些信息最终通过Enviroment.verifyProperties(properties)加入程序中!
!
然后调用了parseSessionFactory(sfNode,name)//sfNode是session-factory中的节点,name是sfNode的中的属性
部分代码如下:
parseSessionFactory(ElementsfNode,Stringname){
Iteratorelements=sfNode.elementIterator();
while(elements.hasNext()){
Elementsubelement=(Element)elements.next();
StringsubelementName=subelement.getName();
if("mapping".equals(subelementName)){
parseMappingElement(subelement,name);
}
elseif("class-cache".equals(subelementName)){
///session-factory中其它节点属性
StringclassName=subelement.attributeValue("class");
AttributeregionNode=subelement.attribute("region");
finalStringregion=(regionNode==null)?
className:
regionNode.getValue();
booleanincludeLazy=!
"non-lazy".equals(subelement.attributeValue("include"));
setCacheConcurrencyStrategy(className,subelement.attributeValue("usage"),region,includeLazy);
}
elseif("collection-cache".equals(subelementName)){
Stringrole=subelement.attributeValue("collection");
AttributeregionNode=subelement.attribute("region");
finalStringregion=(regionNode==null)?
role:
regionNode.getValue();
setCollectionCacheConcurrencyStrategy(role,subelement.attributeValue("usage"),region);
}
elseif("listener".equals(subelementName)){
parseListener(subelement);
}
elseif("event".equals(subelementName)){
parseEvent(subelement);
}
}
重点在parseMappingElement(subElement,name);
部分代码如下:
parseMappingElement(ElementmappingElement,Stringname){
//当我们用xxx.hbm.xml是调用的
finalAttributeresourceAttribute=mappingElement.attribute("resource");
finalAttributefileAttribute=mappingElement.attribute("file");
finalAttributejarAttribute=mappingElement.attribute("jar");
finalAttributepackageAttribute=mappingElement.attribute("package");
//当我们在class用annotation时用的方法
finalAttributeclassAttribute=mappingElement.attribute("class");
if(resourceAttribute!
=null){
finalStringresourceName=resourceAttribute.getValue();
log.debug("session-factoryconfig[{}]namedresource[{}]formapping",name,resourceName);
addResource(resourceName);
}
elseif(fileAttribute!
=null){
finalStringfileName=fileAttribute.getValue();
log.debug("session-factoryconfig[{}]namedfile[{}]formapping",name,fileName);
addFile(fileName);
}
elseif(jarAttribute!
=null){
finalStringjarFileName=jarAttribute.getValue();
log.debug("session-factoryconfig[{}]namedjarfile[{}]formapping",name,jarFileName);
addJar(newFile(jarFileName));
}
elseif(packageAttribute!
=null){
finalStringpackageName=packageAttribute.getValue();
log.debug("session-factoryconfig[{}]namedpackage[{}]formapping",name,packageName);
addPackage(packageName);
}
elseif(classAttribute!
=null){
finalStringclassName=classAttribute.getValue();
log.debug("session-factoryconfig[{}]namedclass[{}]formapping",name,className);
try{
//调用annotationClass进行解析,俱体用法不详addAnnotatedClass(ReflectHelper.classForName(className));
}
如果是resource配置,进行调用addResource(StringresourceName)进行解释xxx.hbm.xml文件:
调用:
add(resourceInputStream,’’resource”,resourceName);
也就是这个方法:
`
privateXmlDocumentadd(InputSourceinputSource,StringoriginType,StringoriginName){
returnadd(inputSource,newOriginImpl(originType,originName));
}
下面来看看SessionFactorybuildSessionFactory()方法此方法返回一个sessioFactoy对象:
SessionFactorybuildSessionFactory()throwsHibernateException{
log.debug("Preparingtobuildsessionfactorywithfilters:
"+filterDefinitions);
secondPassCompile();
if(!
metadataSourceQueue.isEmpty()){
log.warn("mappingmetadatacachewasnotcompletelyprocessed");
}
enableLegacyHibernateValidator();
enableBeanValidation();
enableHibernateSearch();
validate();
Environment.verifyProperties(properties);
Propertiescopy=newProperties();
copy.putAll(properties);
PropertiesHelper.resolvePlaceHolders(copy);
Settingssettings=buildSettings(copy);
returnnewSessionFactoryImpl(
this,
mapping,
settings,
getInitializedEventListeners(),
sessionFactoryObserver
);
}
settings对象传入sessionFactoryImpl中,而settings对象中含有properties的内容,这就是说sessionFactoryImpl完全可以创建与数据库的连接。
Setting由sessionFactory通过builSettings(Propertiesprops)创建详细代码如下:
:
从这里可以看出,在buildSettions()中已经与数据库建立了连接。
publicSettingsbuildSettings(Propertiesprops){
Settingssettings=newSettings();//创建setting对象
//SessionFactoryname:
StringsessionFactoryName=props.getProperty(Environment.SESSION_FACTORY_NAME);
settings.setSessionFactoryName(sessionFactoryName);
//JDBCandconnectionsettings:
ConnectionProviderconnections=createConnectionProvider(props);
/////////////////////////////////////////////////////////////////////
一般我们用url来设定,所以这里用了DriverManagerConnectioniProvider
DriverManagerConnectionProvider通过configure(Propertiesprops)方法来配置sql的连接:
StringdriverManager=props.getProperty(Enviroment.DRIVER);//来获取数据库驱动
connectionProps=ConnectionProviderFactory.getConnectionProperties(props);//来设置一个property属性,其中含有username,password等相关内容
最后在ConnectionProviderSessionFactory里面调用configure(Propertyprops)方法实现了Connection的初始化呀
/////////////////////////////////////////////////////////////////////
settings.setConnectionProvider(connections);
//InterrogateJDBCmetadata
booleanmetaSupportsScrollable=false;
booleanmetaSupportsGetGeneratedKeys=false;
booleanmetaSupportsBatchUpdates=false;
booleanmetaReportsDDLCausesTxnCommit=false;
booleanmetaReportsDDLInTxnSupported=true;
Dialectdialect=null;
JdbcSupportjdbcSupport=null;
//'hibernate.temp.use_jdbc_metadata_defaults'isatemporarymagicvalue.
//Theneedforitisintendedtobealleviatedwithfuturedevelopment,thusitis
//notdefinedasanEnvironmentconstant...
//
//itisusedtocontrolwhetherweshouldconsulttheJDBCmetadatatodetermine
//certainSettingsdefaultvalues;itisusefulto*not*dothiswhenthedatabase
dialect=DialectFactory.buildDialect(props);
dialect=DialectFactory.buildDialect(props);
}
jdbcSupport=JdbcSupportLoader.loadJdbcSupport(null);
}
settings.setJdbcSupport(jdbcSupport);
//Queryparsersettings:
//Second-level/querycache:
booleanuseSecondLevelCache=PropertiesHelper.getBoolean(Environment.USE_SECOND_LEVEL_CACHE,properties,true);
log.info("Second-levelcache:
"+enabledDisabled(useSecondLevelCache));
settings.setSecondLevelCacheEnabled(useSecondLevelCache);
booleanuseQueryCache=PropertiesHelper.getBoolean(Environment.USE_QUERY_CACHE,properties);
log.info("Querycache:
"+enabledDisabled(useQueryCache));
settings.setQueryCacheEnabled(useQueryCache);
//Thecacheproviderisneededwhenweeitherhavesecond-levelcacheenabled
//orquerycacheenabled.NotethatuseSecondLevelCacheisenabledbydefault
settings.setRegionFactory(createRegionFactory(properties,(useSecondLevelCache||useQueryCache)));
booleanuseMinimalPuts=PropertiesHelper.getBoolean(
Environment.USE_MINIMAL_PUTS,properties,settings.getRegionFactory().isMinimalPutsEnabledByDefault()
);
log.info("Optimizecacheforminimalputs:
"+enabledDisabled(useMinimalPuts));
settings.setMinimalPutsEnabled(useMinimalPuts);
Stringprefix=properties.getProperty(Environment.CACHE_REGION_PREFIX);
if(StringHelper.isEmpty(prefix))prefix=null;
if(prefix!
=null)log.info("Cacheregionprefix:
"+prefix);
settings.setCacheRegionPrefix(prefix);
booleanuseStructuredCacheEntries=PropertiesHelper.getBoolean(Environment.USE_STRUCTURED_CACHE,properties,false);
log.info("Structuredsecond-levelcacheentries:
"+enabledDisabled(useStructuredCacheEntries));
settings.setStructuredCacheEntriesEnabled(useStructuredCacheEntries);
if(useQueryCache)settings.setQueryCacheFactory(createQueryCacheFactory(properties));
//SQLExceptionconverter:
SQLExceptionConvertersqlExceptionConverter;
try{
sqlExceptionConverter=SQLExceptionConverterFactory.buildSQLExceptionConverter(dialect,properties);
}
catch(HibernateExceptione){
log.warn("ErrorbuildingSQLExceptionConverter;usingminimalconverter"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 解析