Hibernate启动过程分析

Configuration cfg=new Configuration();
cfg.addClass(User.class);
cfg.configure();
SchemaExport export=new SchemaExport(cfg);
export.create(true, true);


(1)实例化一个Configuration对象:
拥有一个SettingsFactory引用,和初始化hibernate.properties文件的信息.

(2)cfg.addClass(User.class):
类对应的配置文件hbm.xml的属性和对应的资源的捆绑。

(3)cfg.configure();
解释hibernate.cfg.xml文件

(4)SchemaExport export=new SchemaExport(cfg);
export.create(true, true);
将表结构导入数据库的工具。
Configuration类 之 1_Configuration对象
用过Hibernate的朋友都知道下面代码的意思,不知道的话,看这篇文章也没意思了!

启动代码:
Configuration cfg=new Configuration();
cfg.addClass(User.class);
cfg.configure();
SchemaExport export=new SchemaExport(cfg);
export.create(true, true);


(1)实例化一个Configuration对象
Configuration cfg=new Configuration();
--->
public Configuration() {
this( new SettingsFactory() );
}
--->
this( new SettingsFactory() );相当于调用
protected Configuration(SettingsFactory settingsFactory) {
this.settingsFactory = settingsFactory;
reset();
}

Configuration是需要将配置信息的设置委托给SettingsFactory, SettingsFactory拥有设置配置信息的方法,比如说,public Settings buildSettings(Properties props)

返回的Settings类:存放系统配置信息转换的对象,比如从Properties得到的信息,转换成对象,然后存入Settings对象。
(注意:settings是Settings类对象,props是Properties类对象)
String sessionFactoryName = props.getProperty(Environment.SESSION_FACTORY_NAME);
settings.setSessionFactoryName(sessionFactoryName);

Configuration只做自己应该做的事情就是从properties *.cfg.xml读取系统的参数.

---> protected void reset() {
classes = new HashMap();
imports = new HashMap();
collections = new HashMap();
tables = new TreeMap();
namedQueries = new HashMap();
namedSqlQueries = new HashMap();
sqlResultSetMappings = new HashMap();
xmlHelper = new XMLHelper();
typeDefs = new HashMap();
propertyReferences = new ArrayList();
secondPasses = new ArrayList();
interceptor = EmptyInterceptor.INSTANCE;
properties = Environment.getProperties();
entityResolver = XMLHelper.DEFAULT_DTD_RESOLVER;
eventListeners = new EventListeners();
filterDefinitions = new HashMap();
// extendsQueue = new ArrayList();
extendsQueue = new HashMap();
auxiliaryDatabaseObjects = new ArrayList();
tableNameBinding = new HashMap();
columnNameBindingPerTable = new HashMap();
namingStrategy = DefaultNamingStrategy.INSTANCE;
sqlFunctions = new HashMap();
}

reset():
除了申请一些HashMap对象,ArrayList对象,TreeMap对象,用来存放XML解释后的信息外,还有XMLHelper用于帮助读取XML,
EmptyInterceptor用于扩展自定义拦截器。
EventListeners,一个支持对所有session事件的监听器
DefaultNamingStrategy,默认的命名策略。
还有最重要的
properties = Environment.getProperties();
关键是初始化hibernate.properties文件的信息.

Configuration类 之 2_addClass
cfg.addClass(User.class);( Configuration)

public Configuration addClass(Class persistentClass) throws MappingException {

/** 利用类名称把类的.装换为/然后拼接.hbm.xml这样要求你的配置文件必须和类
* 在一个目录下且名称相同.
*/
String mappingResourceName = persistentClass.getName().replace( '.', '/' ) + ".hbm.xml";
//记录日志
log.info( "Reading mappings from resource: " + mappingResourceName );

return addResource( mappingResourceName, persistentClass.getClassLoader() );
}

---> addClass(Class):转换类名,然后跳转到addResource(String,ClassLoader)

--->addResource(String,ClassLoader):得到类的配置(比如说:User.hbm.xml)的输入流,然后跳转到addInputStream(InputStream)

---> addInputStream(InputStream):用 XML帮助类 解释传入来的流,解释成org.dom4j.Document的形式,然后跳转到add(org.dom4j.Document)

---> add(org.dom4j.Document):把传入的Document对象交给
HbmBinder.bindRoot()处理,
HbmBinder类:hbm.xml的捆绑类。产生hbm.xml对应的属性和对应的资源的捆绑。
Configuration类 之 3--configure()
cfg.configure();

--->直接跳转到configure(“"/hibernate.cfg.xml"”)

--->configure(String):
读取hibernate.cfg.xml的配置信息,得到输入流,
跳转到doConfigure( new FileInputStream( configFile ), configFile.toString() );

---> doConfigure(InputStream, String )
用 XML帮助类 解释传入来的流,解释成org.dom4j.Document的形式,
跳转到doConfigure( doc )

---->doConfigure(org.dom4j.Document doc):
读取Hibernate的信息:(分成session-factory和security两部分来处理)
(1) session-factory:
将session-factory的名字存入Environment.SESSION_FACTORY_NAME,
调用addProperties( sfNode ),parseSessionFactory( sfNode, name ),
将Hibernate.xml.hbm的< session-factory >里的<property>标签和其他标签的内容存入。
(2)security:
将Hibernate.xml.hbm的< security >里标签的内容存入。
Configuration类 之 SchemaExport
SchemaExport export=new SchemaExport(cfg);
export.create(true, true);
SchemaExport类是一个将表结构导入数据库的工具。


public SchemaExport(Configuration cfg) throws HibernateException {
this( cfg, cfg.getProperties() );
}
--->
public SchemaExport(Configuration cfg, Settings settings) throws HibernateException
从配置中得到方言dialect,根据方言得到相应生成表的SQL,和删除表的SQL。
创建一个应用程序到数据库的连接帮助类。
---> export.create(true, true);
直接跳转到 execute( true, true, false, false )
----> execute(boolean, boolean, boolean, boolean )
根据导入的SQL(import.sql)进行处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值