作者:xlg1979
研究了一下Weblogic实体Bean实现的装入部分,算是抓住了实体Bean从数据库中同步数据的时机.个人认为掌握了这些东西才能用好CMP 实体Bean,才能掌握EJB的实质,实体Bean谁都会用,用的好坏就难说了.实际上我还发现了weblogic CMP实体Bean实现的不足之处:)可能就是Bug.
1.简单的实体Bean,不带关联.
1)正常执行
a.从执行ejbHome.findByPrimaryKey(..)说起,这个方法返回一个从实例池中选出一个处于'READY'状态的EntityBean实例,
b.默认根据主健同时装入数据库中表中的字段,装入的多少依赖于在配置文件中设置的Field groups(默认装入实体Bean中所有的字段)
c.然后执行ejbLoad方法(这个方法什么也没做,对于实体Bean没多大用处)
d.结束finder方法
如果接着使用实体Bean本地接口的get/set方法,就是改变了实体Bean的字段值,实体Bean不会有太大的变化,
除非选择Delay updates until end of transaction = false,这时每个get/set方法完成都会执行ejbStore方法同步数据库.
2)但是如果在配置文件中加入 Finders Load Bean = false 就可以控制在执行ejbHome.findByPrimaryKey时不装入表中的数据,有下面的执行过程:
a.上数据库中查一下,主健是否存在,如果不存在就跑出ObjectNotFoundException ,注意,这时并没有从实例池中提取EntityBean实例
b.finder方法结束,实际上并没有同步数据库数据.
如果接着执行实体Bean本地接口的get/set方法:
c1.先从实例池中选出一个处于'READY'状态的EntityBean实例
c2.执行ejbLoad方法(ejbLoad的执行顺序与1)中不同了,他是在装入数据之前执行的)
c3.装入EntityBean的数据,同步数据库.但是get,set方法之间还有微妙的差别.
2.实体Bean之间如果有关联
执行实体Bean的findByPrimaryKey(..)方法,注意:这个方法只装入这个实体Bean的数据库数据,对于一些CMR字段并不装入,也就是不装入与这个实体Bean相关联的其它实体Bean的数据
如果执行get/set方法也不不会装入相关联的数据.
但是如果执行getCMRField方法也不见得就立即装入相关联的数据,看下面的方法
Collection c = entityBean.getCmrField();
这时只返回一个空的c,还没有装入实体Bean.
但是我想看一下返回多少个实体Bean,执行下面的操作
int count = c.size();
这个方法要执行很长时间,因为weblogic是这样设计的,当你真正的调用c的方法时那些相关联的实体Bean数据才会装入的,这就是'Lazy Loading '呀!
3.ejbStore何时执行
这个比较简单,weblogic默认是在entity bean 参与到的事务处理结束时触发,但是也可以改变.
看这个选项就行了.Delay updates until end of transaction
可能说的不是很清楚,略过了很多细节,这些我在网上找不到,我是把weblogic反编译才得到这样结论的.
另外你也可以看一下weblogic.ejbc产生的那些文件,名称都比较怪如YySo_gqf3go__WebLogic_CMP_RDBMS,
也多少能找到答案。