hibernate源码研究碎得(4)
1, 为什么在new一个Configuration对象时要调用另一个构造方法呢?而另一个构造方法里接收一个传来的SettingsFactory的参数,难倒说在new一个Configuration时还可以另行指定自造的SettingsFactory?这就像Configuration类里的configure()方法那样?调用无参的configure()方法时就去找那个默认的配置文件,但也是另行指定配置文件的位置的.写到这里想起来了,protected这个限定词所描述的也可以在所在包的其它类里调用从而也就生成了这个可配置SettingsFacotry的Configuration对象.再实际地找着验证下(没找到.....).
可后来一看这个构造方法是protected的,再看有没有子类,没有.那这个protected的contructurer就没用了?那干嘛要多费一道手续地调用那个protected的constructurer呢?在这个无参的construturer里加上那个protected的内容不就OK了?
也就是如下所示:
public Configuration(){
this.settingsFactory = new SettingsFactory();
reset();
}
那为什么不把这个
this.settingsFactory = new SettingsFactory()像Configuration类的那些属性一样放到reset()方法呢?
不行这个没完,我要顺着这个settingsFactory追下去.总觉得这个SettingsFactory有事.
2,security.
hibernate.cfg.xml中能怎么配置security呢?这与Acegy的那个security有什么异同?
3,对XXX.hbm.xml文件解析时,HbmBinder.java类里的getExtendsNeeded这个方法是干啥的?这个方法所说的事以前一点也没遇到过.
留意!!!
4,Mappings这个类是针对XXX.hbm.xml这个配置文件而专门定义的,不过它自己本身没有什么新的内容,而是将Configuration中的那些与XXX.hbm.xml相关的属性都以final的形式攒到一起,再在读取XXX.hbm.xml里所有信息时以mappings.XXX的方式间接地操作Configuration中的属性,高!!!
按值传递 vs 按引用传递.
看到这里也就多多少少地意识到了点儿:想要很明了又熟练地掌握XXX.hbm.xml中的配置,把这个Mappings类弄它个烂熟于胸是有很大帮助的.
这里的名为addTable,实际上执行过程中,会利用那个key值来判断tables中有没有,若已有的话就get出来设置下里面的一些值,若没有话就new一个全新的Table,再把addTable方法里传来的参数设置到新建的Table对象中.
这个addTable方法不错,按如上所述的方法折腾出一个Table对象来(可以是new出来的,也可能是tables里已有的),再把这个Table对象又交给别的method来再处理一次.这个Table对象经过一通这么的折腾一下子升华大了!!!
5,Debug时的一点收获:看到哪个method可疑就把它加以断点,总有它出头露面的时候.
6,看Transaction这个Interface,它有三个实现类:
CMTTrasanction,JDBCTrasanction,JTATransaction
JDBCTransaction很形象,估计也最常用,就是用JDBC来操作DB.
CMTTransaction从名字来看是Container Managed Transaction吧?与EJB有关?
JTATransaction....
在这也不是细究这三个Transaction的差别,最先想到的是这三种不同的Transaction实现是怎么告诉Hibernate的,系统默认的是JDBCTransaction?那这个默认又是在哪体现出来的?若想改为其它的两种又将在哪改?(是在hibernate.cfg.xml文件中?)如何改?像如下所示的Cache那样来配置?
<property name="cache.provider_class">
org.hibernate.cache.NoCacheProvider
</property>
看下Hibernate的tutorial.
看了后发现hibernate.transaction.factory_class这么个属性配置.再看hibernate里的TransactionFactory这个Interface,它有三个实现类分别为:
JDBCTransactionFactory,CMTTransactionFactory,JTATransactionFactory.
呵呵,再参照上面所列Transaction的三个实现类,My God!这不大名鼎鼎的Abstract Factory Pattern嘛.
从Tutorial中来看有如下的描述:defaults to JDBCTransactionFactory.这也就是说要将JDBCTransaction这个Transaction作为默认实现.这样也就回答了上面提出的问题(在哪配?如何配?):通过配置Factory的方式来间接地配置出Transaction的实现.