Domanda

esempio di Let, ho deciso di andare con stack di Java EE per la mia applicazione enterprise.

Ora, per la modellazione di dominio (o: per la progettazione del M di MVC)?, Che le API posso tranquillamente assumere e utilizzare, e che io dovrebbero stare lontano da ... diciamo, tramite un livello di astrazione

Ad esempio,

  1. Devo andare avanti e lettiera il mio Modello con chiamate a Hibernate / JPA API? O, dovrei costruire un'astrazione ... uno strato di persistenza della mia per evitare hard-codifica contro queste due API specifiche di persistenza? Perché chiedo questo: Alcuni anni fa, c'era questa API Kodo che ha ottenuto sostituito da Hibernate. Se uno aveva progettato uno strato di persistenza e codificato il resto del modello contro questo strato (invece di disperdere il modello con le chiamate fornitore specifico API), avrebbe consentito uno a (relativamente) passare facilmente da Kodo a Hibernate per xyz.

  2. E 'consigliato di fare uso aggressivo della QL * a disposizione dal fornitore di persistenza nel modello di dominio? Non sono a conoscenza di eventuali problemi del mondo reale (come le prestazioni, la scalabilità, portabilità, ecc) derivanti da un uso pesante di un linguaggio HQL-like. Perché chiedo questo:. vorrei evitare, per quanto possibile, la scrittura di codice personalizzato quando lo stesso potrebbe essere realizzato tramite interrogazione lingua che è più portabile di SQL

Ci dispiace, ma io sono un novizio completo a questa zona. Dove potrei trovare maggiori informazioni su questo argomento?

È stato utile?

Soluzione

Ecco quello che credo sia il punto di vista tradizionale:

  • Le entità nel progetto costituiscono il modello di dominio. Essi dovrebbero essere riutilizzabili e non strettamente accoppiati ad una tecnologia di persistenza (Tornerò in seguito su accoppiamento lasco stretto vs)
  • Il livello di business, utilizza il modello di dominio, ma espone anche servizi e altri animali.
  • Il livello di accesso ai dati è incaricato a persistere il modello di dominio (entità) in un archivio permanente.

L'entità non dovrebbe chiamare direttamente il livello di accesso ai dati. Ma lo strato d'affari, in modo da carico e persistere entità del modello di dominio.

Se si esegue il mapping che per le tecnologie Java EE di solito si ottiene qualcosa come:

  • Entità -> POJO con annotazioni Hibernate / JPA. Si noti che le annotazioni non implicano un accoppiamento stretto con JPA / Hibernate, lo stesso POJO potrebbe essere utilizzato altrove senza Hibernate.
  • strato di business -> Session EJB o primavera
  • strato di accesso ai dati -> JPA / Hibernate

Questo è uno schizzo e ci sono un sacco di possibili varianti. È in particolare possibile saltare la sessione di EJB e implementare lo strato di business in un altro modo. Si può anche decidere di avere la chiamata strato di business l'APP / Hibernate Session / EntityManager direttamente, nel qual caso JPA / Hibernate è davvero il DAL, oppure si può decidere di avvolgere l'accesso alla sessione / EntityManager in cosiddetti Data Access Objects (DAO ).

Per quanto riguarda HQL, cercare di attenersi a ciò che è portatile, e se si utilizza SQL nativo, seguire SQL-92 convenzioni. Se gli animali si complicano, forse introdurre DAO. In questo modo, si sa che l'unico posto dove ci sono le query HQL è nelle DAO. È possibile anche prima implementare la logica di query "procedurale" nel DAO, e se avete problema di prestazioni, ri-implementarlo con una query HQL più complicato.

Modifica

Per quanto riguarda le vostre domande nel commento:

Il livello di business dipende dal livello dei dati. Se si desidera che lo strato di business perché non dipenda da Hibernate / JPA allora il vostro bisogno livello di dati di abstract Hibernate / JPA distanza. Se si utilizza DAO per la parte dati, che sarà il caso. Il DAO sarà il "sottile strato di persistenza scritte a mano su Hibernate" (per prendere le tue parole). Vorrei introdurre DAO per tutte le entità nel tuo caso.

Che cosa il vostro si pongono è una domanda di design piuttosto generica. Non posso dare una ricetta definitiva per questo, né forse riassumere tutte le varianti in una risposta poiché dipende caso per caso. Per esempio, non abbiamo parlato finora sul problema delle operazioni, che di solito inizia nel livello di business, ma che lo strato di dati deve essere a conoscenza. Ciò dipende in genere sulle tecnologie utilizzate e le vostre esigenze.

Ancora, ecco un elenco di risorse che potrebbe essere interessato a: i libri Modello di Enterprise Application Architecture , il libro Patterns Real World Java EE - Ripensare Best Practices , il libro Domain Driven design e più precisamente i modelli dati Object Access , Repository modello , Open Session in vista (se è per una web app ), E forse Anemic Domain Model .

Modifica 2

Ok, un paio di frasi sutransazioni:

Le operazioni dovrebbero concettualmente essere gestita nel livello aziendale; la definizione di ciò che deve essere fatto in un'unità di lavoro per essere coerente dipende infatti la logica dell'applicazione.

Con EJB3, le transazioni possono essere dichiarati con annotazioni e l'applicazione. server gestisce che per voi. Vedere quest'altra risposta di mine per maggiori informazioni. Con la primavera è anche possibile contrassegnare le transazioni in modo dichiarativo, ma non so i dettagli. In caso contrario, sarà necessario avviare / fermare la transazione da soli. Questo sarà leggermente diversa se si utilizzano le transazioni JDBC o transazioni JTA.

Transazioni riferisce anche ad lazy loading in Hibernate / JPA. Un'entità che era pigro caricato, può infatti essere caricata solo se v'è una transazione corrente. Se le transazioni è terminato nel livello di business, le entità che vengono restituiti alla necessità presentazione strato da avidamente caricati.

Per aggirare questo problema, un modello popolare per le applicazioni web è Open Session in vista , che ho già detto. In questo caso, l'inizio livello di presentazione / fermare le transazioni (che è leggermente sbagliato concettualmente), ma funziona bene con caricamento pigro.

Altri suggerimenti

Il vostro modello di dominio e il suo livello di persistenza dovrebbe in teoria essere separati - non c'è bisogno di una classe chiamata Entity di sapere nulla di se e come viene mantenuto, così si potrebbe usare qualcosa come Hibernate per creare lo strato di persistenza senza inquinare l' classi del modello di dominio stessi. Non lo fai "il codice del modello [...] contro questo livello" - si codifica il modello, quindi mappare in un archivio permanente con una sorta di strato ORM, in cui il modello di dominio non dipende strato ORM. Ovviamente il livello di persistenza dipenderà dal modello di dominio, ma va bene.

Io personalmente combattere timido di usare troppo HQL con (N) Hibernate per la ragione si chiede, ma ci sono momenti in cui è inevitabile. Voi già sanno, e ti sei messo in evidenza, il problema principale lì, quindi e 'difficile trovare un uso eccessivo questo comunque.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top