📄 10.html
字号:
ejbCreate 方法插入到数据库中的,但Entity Bean 同样能通过客户端程序定位这条数据。</FONT></P>
<P class=line><FONT color=#386490> <B>ejbPostCreate
方法</B><BR> 对于每一个ejbCreate 方法,开发人员必须在Entity Bean中写一个ejbPostCreate 方法,EJB
容器在调用完ejbCreate 以后,就立即调用ejbPostCreate ,和 ejbCreate 方法不一样,ejbPostCreate
方法可以调用 getPrimaryKey 等方法,通常ejbPostCreate 方法是空的。</FONT></P>
<P class=line><FONT color=#386490> <B>ejbRemove 方法</B><BR> 当客户端通过调用
remove 方法来删除一个 Entity Bean 的状态数据时,EJB 容器调用 ejbRemove 方法,ejbRemove
方法从数据库中删除一个Entity Bean 状态数据。代码如下:<BR> public void ejbRemove()
{<BR> try {<BR> deleteRow(id);<BR> } catch (Exception
ex){<BR> throw new EJBException
ex("ejbRemove:"+exgetmessage());<BR> }<BR> }</FONT></P>
<P class=line><FONT color=#386490> 如果ejbRemove
方法遇到系统级错误,将执行javax.ejb.EJBException.
如果遇到应用级错误,将执行javax.ejb.RemoveException。<BR> entity bean 的状态数据也可以通过数据库的
delete 语句直接删除数据。</FONT></P>
<P class=line><FONT color=#386490> <B>EjbLoad 方法和 ejbStore
方法</B><BR> EJB 容器需要维持 Entity Bean 的实例变量与数据库中相应值的同步,这需要调用 ejbLaod
方法和ejbStore 方法。ejbLoad 方法用数据库中的数据刷新变量的值,ejbStore
方法把变量的值写入到数据库中。客户端不能调用 <BR>ejbLoad 方法和ejbStore
方法。<BR> 如果业务处理的方法关系到事物处理,EJB 容器要在业务处理方法调用之前调用 ejbLoad
方法刷新数据,业务处理方法执行之后,EJB 容器又立即调用 ejbStore 方法把数据存储到数据库中。因为 EJB
容器调用ejbLoad方法和ejbStore 方法,开发人员在业务处理方法中不必刷新和存储实例变量的值。<BR> 如果ejbLoad
方法和ejbStore 方法不能在低层数据库中定位 Entity Bean,将执行
javax.ejb.NoSuchEntityException。<BR> 在 AccountEJB 类中,ejbLoad 方法调用 loadRow
方法,loadRow 则发出一个 select 语句从数据库提取数据分配给实例变量;ejbStore 方法调用 storeRow
方法,storeRow 方法则用 update 语句把实例变量的值存储到数据库。代码如下:</FONT></P>
<P class=line><FONT color=#386490> public void
ejbLoad(){<BR> try{<BR> loadRow();<BR> }catch (Exception
ex){<BR> throw new EJBException
("ejbLoad:"+ex.getMessage());<BR> }<BR> }</FONT></P>
<P class=line><FONT color=#386490> public void
ejbStore(){<BR> try{<BR> storeRow();<BR> }catch (Exception
ex){<BR> throw new EJBException
("ejbStore:"+ex.getMessage());<BR> }<BR> }</FONT></P>
<P class=line><FONT color=#386490> <B> Finder 方法 :</B><BR> Finder
方法允许客户端查找 entity bean ,AccountClient 中有三种方法查找entity bean:<BR> Account
jones = home.findByPrimaryKey("836");<BR> Collection c
home.findByLastName("Smith");<BR> Collection c
home.findInRange(20.00,99.00);<BR> Entity bean 类必须实现相应的方法,并且文件名以ejbFind
前缀开始,如:AccountEJB 类实现 ejbFindByLastName 的方法如下:<BR> public Collection
ejbFinfBylastName(String lastName)<BR> throw FinderException
{<BR> Collection result;<BR> Try {<BR> Result =
selectByLastName(lastName);<BR> } catch (Exception ex) {<BR> throw
new EJBException("ejbFindByLastName" +
ex.getMessage());<BR> }<BR> if (result.isEmpty()){<BR> throw
new ObjectNotFoundException("No row found.");<BR> }<BR> else
{<BR> return result;<BR> }<BR> }</FONT></P>
<P class=line><FONT color=#386490> 应用系统中特定的 finder ,如 ejbFindByLastName
和ejbFindInRange,是可选的,但是必须含有 ejbFindByPrimaryKey 方法,ejbFindByPrimaryKey
方法用主键作参数,用来定位一个 entity bean 的状态数据,下面是 ejbFindByPrimaryKey
方法的代码:<BR> public String ejbFindByPrimaryKey(String
primaryKey)<BR> throws FinderException {<BR> boolean
result;</FONT></P>
<P class=line><FONT color=#386490> try {<BR> result =
selectByPrimaryKey(primaryKey);<BR> } catch (Exception ex)
{<BR> throw new EJBException("ejbFindByPrimaryKey: " +
ex.getMessage());<BR> }</FONT></P>
<P class=line><FONT color=#386490> if (result) {<BR> return
primaryKey;<BR> }<BR> else {<BR> throw new
ObjectNotFoundException ("Row for id " + primaryKey + " not
found.");<BR> }<BR> }</FONT></P>
<P class=line><FONT color=#386490> ejbFindByPrimaryKey 方法以 primaryKey
作为参数并返回它的值。<BR>注意:1.只有 EJB 容器可以调用ejbFindByPrimaryKey,而客户端不能直接调用
ejbFindByPrimaryKey 方法,客户端只能调用在 home 接口中定义的 findByPrimaryKey。<BR> 2.在
entity bean 类中开发人员必须实现ejbFindByPrimaryKey 方法。<BR> 3.一个 finder 方法的名字必须以
ejbFind 作为前缀。<BR> 4.返回值必须是主键或者是一个主键的集合。</FONT></P>
<P class=line><FONT color=#386490> throw 子句可以包含
javax.ejb.FinderException,和其他别的例外处理例程。如果一个finder
方法只要求返回唯一一个主键,如果主键不存在,则应该执行
javax.ejb.ObjectNotFoundException,ObjectNotFoundException
是FoundException的一个子类;如果 finder 方法要求返回的是一个主键的集合,则应该执行 FinderException
来处理。</FONT></P>
<P class=line><FONT color=#386490> <B> 业务处理方法</B><BR><BR> 业务处理方法包含想在
Entity Bean 中实现的业务处理逻辑。通常业务处理方法不存取数据库,这允许开发人员可以把业务处理逻辑从数据库存取中独立出来。<BR> 在
AccountEJB entity bean 中包含下面的业务处理方法:<BR> public void debit(double
amount)<BR> throw InsufficientBalanceException {<BR> if (balance -
amount <0){<BR> throw new
InsufficientBalanceException();<BR> }<BR> balance -=
amount;<BR> }</FONT></P>
<P class=line><FONT color=#386490> public void credit (double amount)
{<BR> balance += amount;<BR> }</FONT></P>
<P class=line><FONT color=#386490> public String getFirstName()
{<BR> return firstName;<BR> }</FONT></P>
<P class=line><FONT color=#386490> public String getLastName()
{<BR> return lastName;<BR> }</FONT></P>
<P class=line><FONT color=#386490> public double getBalance()
{<BR> return balance;<BR> }</FONT></P>
<P class=line><FONT color=#386490> AccountClient
程序中调用业务处理方法:<BR> Account duke =
home.create("123","Duke","Earl",0.00);<BR> Duke.credit(88.50);<BR> Duke.debit(20.25);<BR> Double
balance = duke.getBalance();<BR>注意:1、业务处理方法的名称不能和 EJB 体系中定义的方法的名称冲突,其他的要求和
entity bean 和 sesson bean 中其它方法的要求相同。<BR> 2、可以在throw
子句中包含应用程序定义的例外处理例程,如 debit
方法执行InsufficientBalanceException。为了识别系统级错误,业务处理逻辑应该调用
javax.ejb.EJBException。</FONT></P>
<P class=line><FONT color=#386490>下面是对 AccountEJB 类中存取数据库的总结:<BR><IMG
height=186 src="ejb2.gif" tppabs="http://www.chinajavaworld.com/doc/ejb/images/ejb2.gif" width=570>
<BR><BR> 因为业务处理方法中不需要存取数据库,所以在 AccountEJB 类中的业务处理方法没有存取数据库。但业务处理方法可以通过
EJB 容器调用 ejbStore 来修改实例变量。当然开发人员也可以在 AccountEJB
类的业务处理方法中存取数据库,这依赖于应用程序的具体要求,在存取数据库之前必须连接数据库。<BR><BR> <B>Home
接口(Interface)</B><BR> <BR> 在home 接口中定义让客户端创建和查找 entity bean 的方法。Account
Home 接口如下:<BR> import java.util.Collection;<BR> import
java.rmi.RemoteException;<BR> import javax.ejb.*;</FONT></P>
<P class=line><FONT color=#386490> public interface AccountHome extends
EJBHome {<BR> public Account create(String id, String firstName, String
lastName, double balance)<BR> throws RemoteException,
CreateException;<BR> <BR> public Account findByPrimaryKey(String id)
<BR> throws FinderException, RemoteException;<BR> <BR> public
Collection findByLastName(String lastName)<BR> throws
FinderException, RemoteException;</FONT></P>
<P class=line><FONT color=#386490> public Collection findInRange(double
low, double high)<BR> throws FinderException,
RemoteException;<BR> }<BR> 在Home 接口中,每一种finder 方法必须和 entity bean 类中的
finder 方法对应;finder 方法的名称必须以 find 开始,就象 entity bean 类中的 finder 方法必须以
ejbFind 一样,例如:AccountHome 类中定义的findByLastName 方法和AccountEJB 类中实现的
ejbFindByLastName 方法。</FONT></P>
<P class=line><FONT color=#386490> <B>Remote 接口</B><BR> <BR> Remote
接口定义客户端可以调用的业务处理方法,Account remote 接口的代码如下:</FONT></P>
<P class=line><FONT color=#386490> import
javax.ejb.EJBObject;<BR> import java.rmi.RemoteException;</FONT></P>
<P class=line><FONT color=#386490> public interface Account extends
EJBObject {<BR> public void debit(double amount)<BR> throws
InsufficientBalanceException, RemoteException;<BR> public void
credit(double amount)<BR> throws RemoteException;</FONT></P>
<P class=line><FONT color=#386490> public String
getFirstName()<BR> throws RemoteException;</FONT></P>
<P class=line><FONT color=#386490> public String
getLastName()<BR> throws RemoteException;</FONT></P>
<P><SPAN class=line><FONT color=#386490> public double
getBalance()<BR> throws
RemoteException;<BR> }<BR><BR></FONT></SPAN></P>
<P></P>
</td>
</tr>
</td>
</tr>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -