2010-09-13 9 views
6

Offensichtlich mit stateless EJB Bohnen in einem Entity-Bean riecht, aber bitte ein Szenario, wie folgt und mir sagen, wenn Sie eine bessere Lösung wissen:Mit stateless EJB Bohnen in einer Entity Bean

  1. Ich habe ein InvoiceTemplate Entity Bean mit Feld NextInvoiceDate
  2. NextInvoiceDate Generierung ist ein komplexer Vorgang und soll außerhalb der InvoiceTemplate Klasse
  3. NextInvoiceDate durchgeführt werden, sollte jedes Mal aktualisiert werden InvoiceTemplate den db gespeichert wird

Für jetzt habe ich Logik in Bezug auf die Erzeugung von NextInvoiceDate in @PrePersist@PreUpdate Methon in InvoiceTemplate EntityBean. Die Logik wird immer komplizierter und ich möchte sie außerhalb der Entity-Bean InvoiceTemplate verschieben. Es scheint mir, dass es einen Dienst geben sollte, um NextInvoiceDate zu berechnen. Aber ist es richtig, diesen Service aus dem Inneren von InvoiceTemplate aufzurufen?

+0

ist es eine Entity-Bean (EJB 2.0) oder eine JPA-Entität? – Bozho

+0

@Bozho, es ist eine JPA-Entität – mgamer

Antwort

3

Es ist nicht so ein Geruch - es ist ein mageres in Richtung Domain-Design.

Ich weiß nicht von irgendeiner Weise dies automatisch zu tun, aber Sie können:

  • in der Session Beans, wo Sie Ihre Invoicetemplate behandeln, injizieren die Helfer-Bean, die die Logik hat das nächste Datum zu berechnen
  • ein eigenes Feld mit einem Setter auf der Entität erstellen, und bevor Sie es entity.setNextDateHelper(..)

Sie auch, ob AspectJ überprüfen rufen mit so nicht einige EJB-Optionen bieten, dass Sie t injizieren Er EJB immer wenn eine Entität eines bestimmten Typs (InvoiceTemplate) erstellt wird. AspectJ funktioniert so mit Spring Beans, ich weiß nicht, ob es solche Möglichkeiten für EJB gibt.

+0

Gut gesagt. +1 nur für den ersten Satz. –

0

Benötigen Sie etwas so Kompliziertes wie einen Service oder EJB? Kannst du einfach eine statische Methode (möglicherweise in einer Dienstprogrammklasse) schreiben, um die Logik zu halten? Normalerweise bin ich ziemlich voreingenommen gegen diese Art von Dingen, aber wenn Sie nur eine komplexe Logik haben, die keine DB-Interaktion oder eine Menge Objektzusammenarbeit erfordert, ist dies vielleicht der sauberste Ansatz.

+0

Testen wäre auf diese Weise verletzt. – mgamer

+1

Nun, was ist, wenn DB_Interaktion und eine Menge Objektzusammenarbeit erforderlich ist? – musiKk

+1

Wenn dies der Fall ist, sind Sie wahrscheinlich wieder bei einem Dienst oder EJB, damit Sie an Transaktionen teilnehmen oder den Kontext freigeben können. Das bringt Sie zurück zu Timing-Fragen, Koordination und Abhängigkeiten. – TMN

Verwandte Themen