Nejsem si jistý, zda to pomůže vaší situaci (tedy pokud stále existuje), nicméně poté, co jsem prohledal web a našel podobný problém.
Vytvářel jsem nativní dotaz z trvalého EntityManager, abych provedl aktualizaci.
Query query = entityManager.createNativeQuery(queryString);
Zobrazila se mi následující chyba:
způsobeno:javax.persistence.TransactionRequiredException:Probíhá dotaz na aktualizaci/smazání
Mnoho řešení navrhuje přidat @Transactional do vaší metody. Jen to nezměnilo chybu.
Některá řešení navrhují požádat EntityManager o EntityTransaction
abyste mohli zavolat begin a zavázat se. Toto vyvolá další chybu:
způsobeno:java.lang.IllegalStateException:Není povoleno vytvářet transakci na sdíleném EntityManager – místo toho použijte transakce Spring nebo EJBCMT
Pak jsem zkusil metodu, o které většina webů tvrdí, že je pro použití správci entit spravovaných aplikací a nikoli správou kontejnerů (což věřím, že Spring je), a to bylo joinTransaction()
.
S @Transactional
zdobení metody a následné volání joinTransaction()
na objektu EntityManager těsně před voláním query.executeUpdate()
a aktualizace mého nativního dotazu fungovala.
Doufám, že to pomůže někomu dalšímu s tímto problémem.