JAVA基礎:TravelAgentRemote(遠程接口)

字號:

創(chuàng)建TravelAgent EJB的第一步是定義它的遠程接口。該接口規(guī)定了允許客戶端調用的EJB業(yè)務方法??蛻舳伺cTravelAgent的createCaben()和findCabin()方法進行交互,以控制Cabin實體。
    package com.titan.travelagent;
    import javax.ejb.Remote;
    import com.titan.domain.Cabin;
    @Remote
    public interface TravelAgentRemote {
    public void createCabin(Cabin cabin);
    public Cabin findCabin(int id);
    }
    TravelAgent EJB的遠程接口實在沒有什么特別之處。除了被標以@javax.ejb.Remote外,它看起來就像一個普通的Java接口。該注解告訴EJB容器,這一特定接口是TravelAgent EJB的遠程業(yè)務接口。還要注意的是,業(yè)務方法不必再像EJB2.1那樣拋出java.rmi.RemoteException了。如果想拋的話依然還可以拋,但是這并非是必須的。
    TravelAgentBean: Bean Class
    TravelAgentBean: The Bean Class
    我們既已定義好針對TravelAgent EJB的遠程接口,就要為該session bean實現(xiàn)包含業(yè)務邏輯的bean class了。TravelAgent EJB被定義為stateless bean。我們使用@javax.ejb.Stateless
    注解來表達此意圖。盡管不是必要的,但對stateless session bean而言,實現(xiàn)其全部業(yè)務接口是一條不錯的實踐,這樣,client/bean契約就能夠通過Java編譯器得到強化。考試,大提示在本例中,業(yè)務接口即 TravelAgentRemote。下面是TravelAgentBean的完整定義。
    package com.titan.travelagent;
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import com.titan.domain.Cabin;
    @Stateless
    public class TravelAgentBean implements TravelAgentRemote{
    @PersistenceContext(unitName="titan") private EntityManager manager;
    public void createCabin(Cabin cabin) {
    manager.persist(cabin);
    }
    public Cabin findCabin(int pKey) {
    return manager.find(Cabin.class, pKey);
    }
    }
    在該實現(xiàn)中,還有若干問題需要進一步闡明。首先,TravelAgentBean類使用了@javax. persistence. PersistenceContext注解來獲得對EntityManager服務的訪問,以此來創(chuàng)建和查找Cabin實體。注解 @PersistenceContext告知EJB容器,必須用一個EntityManager實例來設置manager數(shù)據(jù)成員。EJB容器發(fā)現(xiàn)數(shù)據(jù)成員的類型為javax.persistence.
    EntityManager,便知道應該將數(shù)據(jù)成員設置為一個指向EntitiyManager服務的引用,此服務指向我們在 persistence.xml文件里定義的Titan persistence unit。這一數(shù)據(jù)成員將在bean實例被創(chuàng)建時初始化。
    接下來的兩個方法與 EntityManager服務進行交互,用以在數(shù)據(jù)庫中創(chuàng)建Cabin實體,并依據(jù)主鍵對其進行定位。createCabin()方法調用 EntityManager.persist(),并傳入一個要進行持久化的實體實例。待該操作完成后,Cabin實例就會被納入持久化管理機制,并被存儲到數(shù)據(jù)庫中。稍后我們將會看到,創(chuàng)建Cabin實例與創(chuàng)建任何其他普通Java對象一樣沒有什么區(qū)別。findCabin()方法將數(shù)據(jù)庫中Cabin 實體的一個主鍵作為其參數(shù)。它調用EntityManager.find()方法,并傳入Cabin bean的類型和實際的主鍵作為參數(shù)。Cabin bean的類型參數(shù)告知EntityManager,它在數(shù)據(jù)庫中試圖查找的是何種實體。隨后findCabin()方法將找到的Cabin實體并返回給遠程客戶端。