I am using Spring MVC with Hibernatedaosupport
for my DAO classes. Confused here where to start the transaction, whether it should be in service layer or DAO layer?
My view interacts with Service layer. DAO's are injected into services.
What is the right way to use Spring MVC with Hibernate in DAO, service layer architecture?
IMHO the transactions should go to service layer. Typically one business transaction consists of several queries and updates. If you place @Transactional
only on DAO layer, each query and update will run in a separate transaction, which effectively defeats the purpose of transactions.
But if services are @Transactional
, each database interaction joins one main transaction started when web layer entered the service layer. Note that in this case if web layer runs several service methods, each of them will run in a separate transaction (the same problem shifted one level up). But placing @Transactional
in web layer might introduce unexpected side effects like N+1 problem, which would have been caught otherwise. Thus try to keep one business transaction in one service method called from web layer.
Obviously DAO layer. Anything that connects to data access layer should be in DAO layer and (preferably) annotated with @Repository and your service ( annotated with @Service) should have a handle to DAO instance.
A service can call multiple DAOs but not the other way round. DAOs
should be atomic in nature.
If you are starting a transaction then it should be in service layer in my opinion which supports my previous statement where I mention DAOs should be atomic in nature.
There is a complete information for the Service layers, DAO layer, Entities and Controllers. It has full tutorial with short description for each module.
Site: Spring MVC With Hibernate CRUD
Or You may visit YouTube Channel: Spring MVC with Hibernate CRUD VIDEO