3
votes

I am trying to connect my Play application with a database, I am following controller->service->DAO layer style.

Where should the @Transactional annotation be placed. In the controller action method or can I place it in a service layer class level/method level.

I tried keeping the @Transactional annotation in one of the Service layer class's method and it has thrown runtime error.

[RuntimeException: No EntityManager found in the context. Try to annotate your action method with @play.db.jpa.Transactional]

So, do we have to use @Transactional only on top of the controller actions? I am using play 2.4.2 version. If yes, why? As I am calling my DAO's in service layer the actual database operations will begin in service layer not in controller I guess. In controller, I am just calling the service layer.

1

1 Answers

7
votes

I would recommend not to use @Transactional because it wraps entire action in an JPA transaction. It would be more efficient to start the transaction closer to db call.

I prefer starting the transaction at service level. Also it is important to note that db call is a blocking process so it must be executed outside of default action context.

Take a look at simple DAO+Service example https://gist.github.com/dzagorovsky/b8064c97ba647ed453ab

Also read about play thread pools here https://www.playframework.com/documentation/2.4.x/ThreadPools#Using-other-thread-pools

Blocking code (db calls) handling described here: https://www.playframework.com/documentation/2.3.x/JavaAsync