First of all, you don't need two transaction boundaries, I suggest you remove @Transactional
from your DAO and keep the one in your service.
Start by verifying that spring-transaction has initiated a transaction: Use the debugger and stop the application after the transaction boundary, for instance in your TestService.save
-method. If transactions are running, you will see org.springframework.transaction.interceptor.TransactionInterceptor#invoke
in the call stack. If you don't see the TransactionInterceptor, then that's your problem. Post your persistence.xml
file if transactions are running.