1 kurze Frage zur Transaktionsfunktion von Spring JPA Repositories. Ich habe einen Dienst, der nicht als transaktional gekennzeichnet ist und die Spring JPA-Repository-Methode aufruft.
%Vor%Und es ist definiert als
%Vor%Das Problem ist, dass es mit " Kein EntityManager mit tatsächlich für den aktuellen Thread verfügbarer Transaktion fehlschlägt - kann 'remove" Aufruf nicht zuverlässig verarbeiten; verschachtelte Ausnahme ist javax.persistence.TransactionRequiredException "Ausnahme.
Ok, ich kann es lösen, indem ich die Methode oder deleteByEmail (..) als transaktional markiere, aber ich kann einfach nicht verstehen, warum es jetzt abstürzt. In der Springdokumentation wird explizit angegeben, dass " CRUD-Methoden für Repository-Instanzen standardmäßig transaktional sind. " ( Ссылка ), aber anscheinend ist dies nicht ... Also bezieht sich diese Aussage nur auf Mitglieder von CrudRepository
?
ps: das ist für Spring Data JPA 1.9.4
Sie haben Recht. Nur CRUD-Methoden ( CrudRepository
Methoden) sind standardmäßig als transaktional markiert.
Wenn Sie benutzerdefinierte Abfragemethoden verwenden, sollten Sie diese explizit mit @Transactional
annotation markieren.
Sie sollten sich auch der Konsequenzen der Markierung von Repository-Schnittstellenmethoden anstelle von Servicemethoden bewusst sein. Wenn Sie die Standardtransaktionskonfiguration ( Propagation.REQUIRED
) verwenden, dann:
Die Transaktionskonfiguration in den Repositories wird vernachlässigt dann, wie die äußere Transaktionskonfiguration die tatsächliche bestimmt verwendet.
Tags und Links java jpa spring-data spring-transactions