Cabin实体已经就绪,我们需要创建一个session bean,作为和Cabin实体交互的接口。该session bean将承担业务流程和(实体)访问代理的职责,我们称其为TravelAgent EJB。 TravelAgentRemote:远程接口
/ l) b7 v E% r1 v" O3 O 创建TravelAgent EJB的第一步是定义它的远程接口。该接口规定了允许客户端调用的EJB业务方法。客户端与TravelAgent的createCaben()和findCabin()方法进行交互,以控制Cabin实体。
# h$ Y) [: G: b) i package com.titan.travelagent;
5 h8 l" I. ~+ L# r* u3 D import javax.ejb.Remote; " ]0 ?0 k& I3 v! i4 C) W" l
import com.titan.domain.Cabin;
2 k: o# Y* a2 \3 f( S @Remote
; C, P- ~# V8 j+ B O& X( x public interface TravelAgentRemote { ! X3 p+ S- T5 E/ T: e
public void createCabin(Cabin cabin); 9 {& j0 U$ x7 y3 i
public Cabin findCabin(int id);
# Q9 V) ~4 Q7 h$ k } ?, O. o4 e& \: G9 y/ g
TravelAgent EJB的远程接口实在没有什么特别之处。除了被标以@javax.ejb.Remote外,它看起来就像一个普通的Java接口。该注解告诉EJB容器,这一特定接口是TravelAgent EJB的远程业务接口。还要注意的是,业务方法不必再像EJB2.1那样抛出java.rmi.RemoteException了。如果想抛的话依然还可以抛,但是这并非是必须的。; ^& S" R4 `. d# l: |& u6 z2 |
TravelAgentBean: Bean Class6 c( G6 ]# z2 J+ k
TravelAgentBean: The Bean Class
5 [# R5 O, B9 y7 B9 U: { 我们既已定义好针对TravelAgent EJB的远程接口,就要为该session bean实现包含业务逻辑的bean class了。TravelAgent EJB被定义为stateless bean。我们使用@javax.ejb.Stateless; v- M& O" H( B; S# T* O
注解来表达此意图。尽管不是必要的,但对stateless session bean而言,实现其全部业务接口是一条不错的实践,这样,client/bean契约就能够通过Java编译器得到强化。在本例中,业务接口即 TravelAgentRemote。下面是TravelAgentBean的完整定义。6 B/ P) e- |1 }
package com.titan.travelagent;
B2 t7 B3 \5 Y2 g import javax.ejb.Stateless;
' j/ c% }8 Q* h/ W( z$ H4 W import javax.persistence.EntityManager;
' s7 x4 Z& T1 ?! J6 t. ` import javax.persistence.PersistenceContext;
% {& L- B6 T' H' J5 @ import com.titan.domain.Cabin;
3 Q1 L1 ^- B, X, I) }9 A1 J% V- U
0 x D! D- `: a7 h8 t5 a+ J- l7 U6 V @Stateless |