better use case and good delivery. thank you for this atomic featured videos. it will change the way we knew about what we already knew. it's great please put this video in to a atomic features playlist.
All well and good using this in your service layer, but how will this work with clean architecture? The service layer would be replaced by the Domain layer and we all know the domain layer has zero dependencies on any other layer such as the outer spring layers etc. How would implement transactional behaviour using clean architecture and even things like cascade?
Maybe a solution is to have the controller call a dumb Service such as PersonService which contains the PersonUseCase. When the client calls PersonService.save() the save() method within the PersonService will have the @Transaction annotation and then the next line of code within PersonService.save() will be personUseCase.execute(). This way we simply delegate to the usecase where the business logic lives and at the same time it is transactional?
@Valid and @Validate are JPA annotations, so that is a different use case, and will throw exception at the controller during binding, won't even go to Service layer.
lol. Your initial example is totally differently to the one you implement. It is a totally different problem to the code you implement. so how do you manage concurrent buyers after one book? Sorry what you describe at the start is not a transaction. The book being sold when the buy button is pressed is the transaction.