2012-01-24 7 views
8

Sto utilizzando Spring MVC con Hibernatedaosupport per le mie classi DAO. Confuso qui da dove iniziare la transazione, se dovrebbe essere nel livello di servizio o nel livello DAO?Qual è il modo corretto di utilizzare MVC molla con Hibernate in DAO, architettura del livello di servizio

La mia vista interagisce con il livello di servizio. I DAO vengono iniettati nei servizi.

Qual è il modo corretto per utilizzare Spring MVC con Hibernate in DAO, architettura del livello di servizio?

+0

u può spiegarmi chiaramente ... –

+0

@JustinThomas che è come utile, ma diversi. –

risposta

20

IMHO le transazioni devono passare al livello di servizio. In genere una transazione aziendale è composta da diverse query e aggiornamenti. Se si posiziona @Transactional solo sul livello DAO, ogni query e aggiornamento verrà eseguito in una transazione separata, che effettivamente sconfigge lo scopo delle transazioni.

Ma se i servizi sono @Transactional, ogni interazione di database unisce una transazione principale avviata quando il livello Web è entrato nel livello di servizio. Nota che in questo caso se il web layer esegue diversi metodi di servizio, ognuno di essi verrà eseguito in una transazione separata (lo stesso problema si è spostato di un livello). Tuttavia, il posizionamento di @Transactional nel livello Web potrebbe introdurre effetti collaterali imprevisti come il problema N + 1, che altrimenti sarebbero stati rilevati. Quindi cerca di mantenere una transazione commerciale in un unico metodo di servizio chiamato dal livello web.

+0

grr mi ha battuto su di esso .... + 1 – hvgotcodes

+0

Allo stesso modo, dagnabbit! –

+0

Tomasz mi batte sempre ... +1 – aweigold

0

Ovviamente livello DAO. Tutto ciò che si collega al livello di accesso ai dati dovrebbe essere nel livello DAO e (preferibilmente) annotato con @Repository e il tuo servizio (annotato con @Service) dovrebbe avere un handle per l'istanza DAO.

Un servizio può chiamare più DAO ma non viceversa. DAOs dovrebbe essere di natura atomica.

Se si avvia una transazione, allora dovrebbe essere in livello di servizio a mio parere, che supporta la mia dichiarazione precedente in cui ho citato DAO dovrebbe essere atomica in natura.

+0

ma se inizio Transazione in livello DAO, sto ottenendo due sessioni aperte eccezione o nessuna sessione vincolata ... becoz nel livello di servizio se chiamo due metodi quei due metodi stanno usando sessioni diverse a destra .. quindi come risolvere questo .. –

+1

Perché? Ciò richiederebbe operazioni nidificate per tutto ciò che passa attraverso più di un DAO. –

+0

ghostrider negativo, la risposta @tomasz è corretta ... – hvgotcodes

Problemi correlati