Hallo zusammen,
wie baut man am Besten ein größeres JPA Projekt auf? Ich würde das so machen:
An unterster Stelle stehen die Entity-Beans, die die physikalischen Tabellen in der Datenbank reprästentieren:
Anschließend folgen die DAOs. Diese beinhalten den EntityManager und speichern die Named(Native)Querys, was mich gleich zur nächsten Frage bringt: Wie kommt der EntityManager in das DAO und wo sollten die Querys gespeichert werden?
Ich würde für jede Entity ein eigenes DAO anlegen. Ist das soweit die korrekte Vorgehensweise? Was mache ich, wenn Abfragen über mehrere Entitys notwendig sind, die keiner Entity zuzuordnen sind? Ein "NoEntityDAO"?
Jetzt kommt bei mir die Handler-Schicht (Business-Logik). Ein Handler kann mehrere DAOs beinhalten und daraus Methoden aufrufen. Er kümmert sich bspw. um alle Stammdaten (die ja auf mehrere DAOs und Entitys verteilt sein können). Aus den Ergebnissen der Methode baut er ein Business-Object, welches dann weiter nach oben gereicht wird. Ist das soweit üblich? Und wie kommen die DAOs in den Handler? Einfach über "new" instanziieren? Oder mit einem Singleton?
Diese Handler werden dann von Fassaden aufgerufen, welche die eigentlichen Beans darstellen. Eine Fassade hat Zugriff auf mehrere Handler und macht eigentlich nichts weiter, als eine einzelne Handler-Methode aufzurufen. Eine Fassade ist für die Belieferung eines zusammenhängenden Programmteils (bspw. eine GUI Maske) zuständig. Auch hier meine Frage: Ist das so in Ordnung? Wie komme ich an die Instanzen der Handler? So wie bei den DAOs?
So, ich hoffe, ich habe jetzt nichts vergessen. Ansonsten dürft ihr mich jetzt gerne in der Luft zerreisen .
Danke!
wie baut man am Besten ein größeres JPA Projekt auf? Ich würde das so machen:
An unterster Stelle stehen die Entity-Beans, die die physikalischen Tabellen in der Datenbank reprästentieren:
Java:
@Entity
@Table(name = "test_tbl")
public class Test extends BaseEntity {
@Id
private Long id;
@Column(name = "string_column");
private String stringColumn;
// ...
}
Anschließend folgen die DAOs. Diese beinhalten den EntityManager und speichern die Named(Native)Querys, was mich gleich zur nächsten Frage bringt: Wie kommt der EntityManager in das DAO und wo sollten die Querys gespeichert werden?
Java:
public class TestDAO {
private static final String FIND_ALL = "project.Test.findAll";
// Wie kommt der ins DAO?
private EntityManager entityManager;
public List<Test> findAll() {
// Woher kommt der NamedQuery? Aus einer XML? Aus einer Datei? Als Annotation direkt am DAO?
Query query = entityManager.createNamedQuery(FIND_ALL);
@SuppressWarnings("unchecked")
List<Test> list = query.getResultList();
return list;
}
}
Ich würde für jede Entity ein eigenes DAO anlegen. Ist das soweit die korrekte Vorgehensweise? Was mache ich, wenn Abfragen über mehrere Entitys notwendig sind, die keiner Entity zuzuordnen sind? Ein "NoEntityDAO"?
Jetzt kommt bei mir die Handler-Schicht (Business-Logik). Ein Handler kann mehrere DAOs beinhalten und daraus Methoden aufrufen. Er kümmert sich bspw. um alle Stammdaten (die ja auf mehrere DAOs und Entitys verteilt sein können). Aus den Ergebnissen der Methode baut er ein Business-Object, welches dann weiter nach oben gereicht wird. Ist das soweit üblich? Und wie kommen die DAOs in den Handler? Einfach über "new" instanziieren? Oder mit einem Singleton?
Java:
public class SomeDataBO extends BaseBO {
private String value1;
private String value2;
// Getter und Setter
}
Java:
public class MasterDataHandler {
// Wie komme ich hier an die DAOs?
private TestDAO testDAO;
private OtherDAO otherDAO;
public SomeDataBO findSomeData(boolean aFlag) {
SomeDataBO sdb = new SomeDataBO();
sdb.setValue1(testDAO.getValue());
sdb.setValue2(otherDAO.getValue(aFlag));
return sdb;
}
}
Diese Handler werden dann von Fassaden aufgerufen, welche die eigentlichen Beans darstellen. Eine Fassade hat Zugriff auf mehrere Handler und macht eigentlich nichts weiter, als eine einzelne Handler-Methode aufzurufen. Eine Fassade ist für die Belieferung eines zusammenhängenden Programmteils (bspw. eine GUI Maske) zuständig. Auch hier meine Frage: Ist das so in Ordnung? Wie komme ich an die Instanzen der Handler? So wie bei den DAOs?
Java:
@Local
@Remote
@Stateless(name = "CoolFacade")
@TransactionManagement(TransactionManagementType.CONTAINER)
public class CoolFacade extends BaseFacade implements ICoolFacade {
// Wie kommt der MasterDataHandler in die Bean?
private MasterDataHandler masterDataHandler;
public SomeDataBO findSomeData(boolean aFlag) {
return masterDataHandler.findSomeData(aFlag);
}
}
So, ich hoffe, ich habe jetzt nichts vergessen. Ansonsten dürft ihr mich jetzt gerne in der Luft zerreisen .
Danke!