Это ограничение с Spring AOP. (динамические объекты и CGLIB)
Если вы настроите Spring на использование AspectJ для обработки транзакций, ваш код будет работать.
Простая и, вероятно, лучшая альтернатива - реорганизовать ваш код. Например, один класс, который обрабатывает пользователей, и один, обрабатывающий каждого пользователя. Тогда обработка транзакций по умолчанию с Spring AOP будет работать.
Советы по настройке для обработки транзакций с AspectJ
Чтобы включить Spring для использования AspectJ для транзакций, вы должны установить режим AspectJ:
<tx:annotation-driven mode="aspectj"/>
Если вы используете Spring с более старой версией, чем 3.0, вы также должны добавить это в свою конфигурацию Spring:
<bean class="org.springframework.transaction.aspectj
.AnnotationTransactionAspect" factory-method="aspectOf">
<property name="transactionManager" ref="transactionManager" />
</bean>