我需要一些關於在Java中設計N層系統的「集成層」的建議。此層負責持續並檢索「業務層」(位於單獨的服務器上)的數據。我是J2EE新手,我已經閱讀了幾本書和博客。技術首字母縮略詞的字母表讓我很困惑,所以我有一些問題。集成層與業務層的接口如何?
首先,我到目前爲止:我正在使用JPA(通過Hibernate)來持久化和檢索數據到數據庫。我製作了我的數據訪問對象EJB,並計劃部署到應用服務器(JBoss),這使得事務更輕鬆(它們處於我的DAO的功能級別),我不必擔心獲取EntityManager的句柄依賴注入)。以下是一個示例:
@Entity
class A{
@Id
Long id;
@OneToMany
List<B> setOfBs = new ArrayList<B>;
}
@Entity
class B{
@Id
Long id;
}
@Remote
public interface ADAO{
public A getAById(Long id);
}
@Stateless
class ADAOImpl implements ADAO{
@PersistenceContext
EntityManager em;
public A getAById(Long id){ ... }
}
我的問題:業務層應該如何與Integration Tier交換數據。我閱讀過RESTful服務,它們看起來很簡單。我擔心的是當get和set的頻率增加時(HTTP通信似乎並不特別快)。另一個選擇是RMI。我的DAO已經是EJB了。我可以讓業務層直接訪問它們(通過JNDI)嗎?如果是這樣,如果上面示例中的@OneToMany鏈接被延遲加載,會發生什麼?
例如,如果業務層做類似如下:
Context context = new InitialContext(propertiesForIntegrationTierLookup);
ADAOImpl aDao = (ADAOImpl) context.lookup("something");
A myA = aDao.getAById(0);
int numberOfBs = myA.setOfBs.size();
如果setOfBs名單延遲加載,當業務層(一個單獨的服務器上)訪問列表,是大小是否正確?通過EJB的魔力,列表是否能夠正確加載?如果沒有(我期望),解決方案是什麼?
對不起,很長的文章。就像我剛纔說的,我是J2EE新手,並且已經閱讀了足夠的內容以獲得一般想法,但是我需要幫助將這些部分合併到一起。
我接受了您的意見,並花了最近幾天研究EE設計模式。看起來我有兩種選擇在集成層和業務層之間傳輸數據:DTO或REST。 使用DTO似乎會在集成層上引入大量額外代碼(從Doman類A轉換爲DTO B等),但DTO可以在業務層中重用。 對於集成層來說,REST很容易,但業務層必須執行解析和性能的繁瑣工作可能是一個問題。這兩種解決方案都不是完美的 有第三種選擇嗎? – Quicksilver 2011-05-16 21:35:59
哎呀,我不是說REST。這兩個選項將是DTO或一些基於文本的方法,如XML。 – Quicksilver 2011-05-17 00:14:29