> to henry.t daquan198163
>
> 我认为你们两个问题其实还是同一个问题,REFERENCE
> NAME其实是在调用者和被调用者之间的一个中间者,以达到调
> 谜吆捅坏饔谜咄耆怦睿皇褂REFERENCE NAME也可以。
>
> 调用者--->JNDI ---> REFERENCE NAME --->
> 被调用者的Home接口
>
>

定义了reference后应该是不用再从jndi中去查找了吧,同志


所以还请楼上的老兄给大家指条明路!

这个问题我也不太清楚,要不也不是用“好像”,我谈谈自己的一些理解。
ejb reference的引入应该有两个意义:
1. 如banq大哥所说,实现client端代码和jndi的解耦。
2. 是部署期jndi信息在bean中的缓存。因为bean知道自己需要什么,所以不需要在运行期向jndi去查找。看一下local ejb reference的具体定义可以说明这一点:
<ejb-local-ref>
<description />
<ejb-ref-name>EbsExt</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>com.mycompany.dbm.EbsExtHome</local-home>
<local>com.mycompany.dbm.EbsExt</local>
<ejb-link>EbsExt</ejb-link>
</ejb-local-ref>

在weblogic中,在weblogic-ejb-jar.xml中还有如下定义:
<ejb-local-reference-description>
<ejb-ref-name>EbsExt</ejb-ref-name>
<jndi-name>EbsExt</jndi-name>
</ejb-local-reference-description>
可以看到在reference的定义中也包含了类型信息。并且reference的定义和jndi是一一对应的。
其实也可以通过home factory设计模式达到这种效果,只不过模式实现的是运行期的缓存,reference实现的是部署期的缓存。

晕,xml代码没显示出来,

[ejb-local-ref]
[description /]
[ejb-ref-name]EbsExt[/ejb-ref-name]
[ejb-ref-type]Entity[/ejb-ref-type]
[local-home]com.picc.epicc.dbm.EbsExtHome[/local-home]
[local]com.picc.epicc.dbm.EbsExt[/local]
[ejb-link]EbsExt[/ejb-link]
[/ejb-local-ref]

weblogic-ejb-jar.xml中:
[ejb-local-reference-description]
[ejb-ref-name]EbsExt[/ejb-ref-name]
[jndi-name]EbsExt[/jndi-name]
[/ejb-local-reference-description]

顶!!!!!!!!!!!!!!!!!!!!!!!!!!!

我的EJB客户端和EJB在同一个JVM里,即用JBOSS自带的Tomcat(JSP)调用本机的JBOSS上EJB,JBOSS第一次启动是调用是正常的。当我重新部署那个EJB的时候,就出错了,报的是CreateException。我找了很多资料,都没有这方面的介绍。我估计是原来Client和EJB在用同一个ClassLoader加载的,但当EJB重新部署的时候,用的另外一个ClassLoader加载了,所以出错,即Client的EJB home接口和新部署进来的home接口不是一个拷贝。

另,如何设定JBOSS里EJB部署上去后的初始化个数?(SessionBean),即我把EJB部署上去自动执行ejbCreate方法创建EJB对象。WebLogic里是有设定的,但是JBOSS没有。

请高手指点,谢谢!