2012-03-23 72 views
0

我正在研究(幾乎)香草Java EE 6堆棧(EJB,JPA,JSF等)的應用程序。我們正在Glassfish 3上託管我們的應用程序,現在我們的持久相關代碼是100%純JPA。正在使用適用於驗證JPA實現的Java斷言

不幸的是,我們應用程序的一部分必須在Oracle 10g數據庫中使用存儲過程。爲了調用這個存儲過程,我們決定使用EclipseLink(與Glassfish捆綁在一起的JPA實現)。

由於我們的代碼的(小)部分現在依賴於EclipseLink,我想知道如何驗證這種依賴關係。依賴關係未與應用程序一起打包,但假定可在我們的部署平臺(即Glassfish)上使用。

在我看來,我們的選擇是:

  1. 不要做任何事,就讓它失敗。我認爲這個解決方案是次優的,因爲它從未明確表示我們的代碼假定存在EclipseLink。
  2. 在if語句中檢查EclipseLink並拋出一個特定的異常。

    if (!JpaHelper.isEclipseLink(entityManager)) { 
        throw new InvalidJpaImplementationException(); 
    } 
    
  3. 添加斷言,檢查EclipseLink並讓它在失敗時拋出異常。

    assert JpaHelper.isEclipseLink(entityManager)) : "Blah!"; 
    

會斷言(選項3)是一個有效的解決方案嗎?你想要另一種解決方案嗎?哪一個,爲什麼?

+0

爲什麼你的存儲過程依賴於EclipseLink?你不能找到一個可移植的實現嗎?向我們展示一些代碼... – perissf 2012-03-23 08:55:55

+0

JPA不支持調用存儲過程。你會如何建議我們可以使這更便攜?可以在其他應用程序服務器上部署EclipseLink,因此我只想在代碼中明確地表示這種依賴關係(除了在文檔中提及它)。 – 2012-03-23 09:00:46

+0

JPA 2。1將支持存儲過程(最終時),並且DataNucleus JPA已經提供了此機制(與規範相匹配)。很明顯,你現在可以像現在這樣編寫自己的變體,並在可用時將其交換到JPA2.1機制 – DataNucleus 2012-03-23 11:29:27

回答

2

由於您使用的是JPA,因此我不會使EclipseLink具體實現(因爲它的必須符合JPA規範)。人們不應該關心他們使用的JPA提供商。

如果您決定轉向(假設)Hibernate(如果您實施依賴關係驗證),那麼您的代碼可能會中斷。 JPA規範的全部目的是開發人員不應該擔心實現供應商產品。


如果你想使用Eclipse Link的存儲過程,那麼我會建議你創建一個引擎,將調用存儲過程,無論EntityManager的。這樣,它仍然不會擔心JPA實現提供者依賴。如何使用Hibernate JPA調用StoredProcedure的示例可以在here中找到。

+0

謝謝。我同意你的評論,但是,JPA不提供調用存儲過程的方法。這些存儲過程是必要的(至少在短期內),但這只是我們應用程序的一小部分。與我們的其他應用程序(持久方式)完美整合的唯一解決方案是使用我們JPA實現的特定功能。實際的問題在於,如果我們使用這些功能,會在這裏使用斷言嗎? – 2012-03-23 09:38:06

+0

我編輯了我的帖子,以進一步闡述我的答案。 – 2012-03-23 10:17:02

+0

我不確定我完全理解你的答案。也許更多的信息:我需要一個特定於實現的'EntityManager'的原因是我需要活動的'Session'來整合交易等。這段代碼已經與應用程序的其他部分完全分開了(我假設是_engine_的意思)。 – 2012-03-23 10:31:34

0

斷言可以被禁用,這將錯誤地破壞你的代碼。因此,正式更好沒有斷言。如果將來其他實體管理器被刪除,您最好刪除測試而不是禁用斷言。原因:您「幸運」的是另一個JPA使用了另一個實現。也許僅僅爲InvalidJpaImplementationException進行記錄也更簡單。

+0

我知道斷言可以被禁用,這也是我喜歡解決方案的部分原因。測試不是不必要地執行,但它確實使依賴性明確。日誌聲明也可以做到這一點,但可能更詳細。 我還沒有信服這個選擇,但感謝您的建議,我會再考慮一下。 – 2012-03-23 09:11:32

+0

一般來說,我很晚才從DB層移除錯誤記錄/可理解的錯誤檢測。一般來說,速度增益不會超過QA。但是,如果沒有測試,你很快就會收到失敗。所以這取決於你的自由裁量權。 – 2012-03-23 11:08:52