2010-09-13 111 views
6

顯然使用無狀態EJB豆實體bean中的氣味,但請考慮這樣一個場景如下,並告訴我,如果你知道一個更好的解決方案:在實體Bean使用無狀態EJB豆

  1. 我有一個InvoiceTemplate實體Bean與現場NextInvoiceDate
  2. 生成NextInvoiceDate是一個複雜的過程,並應所述InvoiceTemplate
  3. NextInvoiceDate應每次InvoiceTemplate更新被存儲到分貝的外側進行

現在我有一個關於在InvoiceTemplate實體bean在@PrePersist​​methon產生的NextInvoiceDate邏輯。邏輯越來越複雜,我想把它移到InvoiceTemplate實體bean之外。它看起來應該有一個服務來計算NextInvoiceDate。但是,從InvoiceTemplate內部調用此服務是否正確?

+0

它是一個實體bean(EJB 2.0)還是一個JPA實體? – Bozho 2010-09-13 11:48:55

+0

@Bozho,它是一個JPA實體 – mgamer 2010-09-13 11:56:43

回答

3

這是不是這樣的氣味 - 這是對領域驅動設計精簡。

我不知道有什麼辦法來自動做到這一點,但你可以:

    在會話bean
  • ,你處理你Invoicetemplate,注入助手豆具有計算下一個日期的邏輯
  • 創建一個私有字段上的實體制定者,而你之前開始使用它撥打entity.setNextDateHelper(..)

您還可以檢查是否AspectJ不提供一些EJB選項,以便您可以注入ŧ他創建了一個給定類型的實體(InvoiceTemplate)。 AspectJ與Spring bean一樣工作,我不知道EJB是否有這樣的選項。

+0

那麼說。 +1僅用於第一句。 – 2011-09-23 07:45:22

0

你還需要什麼複雜到一個服務或EJB?你可以只寫一個靜態方法(可能在實用程序類)來保存邏輯?通常情況下,我非常偏向於這種事情,但是如果你擁有的是一些複雜的邏輯,不需要任何數據庫交互或很多對象協作,它可能是最乾淨的方法。

+0

測試會以這種方式受到傷害。 – mgamer 2010-09-13 13:23:11

+1

那麼,如果它_does_需要數據庫交互和很多對象協作呢? – musiKk 2010-09-13 14:15:58

+1

如果確實如此,那麼您可能會再次返回服務或EJB,以便您可以參與事務或共享上下文。這將您帶回到計時問題,協調和依賴關係。 – TMN 2010-09-14 16:25:36