TransactionRequiredException Ausführen einer Aktualisierungs-/Löschabfrage

Lesezeit: 6 Minuten

Benutzer-Avatar
Benutzer41498

Hallo, ich verwende Hibernate JPA mit Spring und Mongodb und führe meine Anwendung auf Glassfish-4.0 aus.

Meine Serviceklasse ist:

@Component
public class Test {
    @PersistenceContext
    EntityManager em;
    EntityManagerFactory emf;

    @Transactional
    public String persist(Details details) {
        details.getUsername();
        details.getPassword();

        Query query = em.createNativeQuery("db.details.find(username="+details.getUsername()+"&password="+details.getPassword());

        em.getTransaction().begin();
        em.persist(details);
        em.getTransaction().commit();
        em.flush();
        em.clear();
        em.close();
        query.executeUpdate();
        System.out.println("Sucessful!");
        return "persist";        
    }
}

Und meine spring-context.xml ist:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <context:component-scan base-package="com.javapapers.spring.mvc" />
    <context:annotation-config />
    <mvc:annotation-driven />
    <tx:annotation-driven transaction-manager="txManager" />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="ogmTest"/>
    </bean>
    <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    </bean>
</beans>

Ich habe einige Änderungen im Code vorgenommen, aber sie haben keine Auswirkungen. Kann mir bitte jemand helfen, das zu klären. Danke im Voraus.

  • Versuchen Sie zu entfernen em.getTransaction().begin();em.getTransaction().commit();em.flush();em.clear();em.close(); Es sollte bis zum Frühjahr dauern, Ihre Transaktion zu verwalten

    – kamil

    13. September 2014 um 9:15 Uhr


  • Danke für die Antwort, die ich mit dem, was Sie vorgeschlagen haben, versucht habe, aber es gibt keine Änderung.

    – Benutzer41498

    13. September 2014 um 10:45 Uhr

  • Hibernate JPA (Spring Data JPA) mit Mongo? Ich glaube nicht, dass es funktionieren wird – Mongo, das NoSQL ist, entspricht nicht den ACID-Eigenschaften. spring-data-mongodb ist etwas, das Sie verwenden sollten.

    – balboa_21

    13. April 2018 um 7:21 Uhr

Benutzer-Avatar
Zeichnete Corbin

Ich bin mir nicht sicher, ob dies Ihrer Situation helfen wird (das heißt, wenn es noch existiert), nachdem ich das Internet nach einem ähnlichen Problem durchsucht habe.

Ich habe eine native Abfrage aus einem Persistenz-EntityManager erstellt, um ein Update durchzuführen.

Query query = entityManager.createNativeQuery(queryString);

Ich habe die folgende Fehlermeldung erhalten:

verursacht durch: javax.persistence.TransactionRequiredException: Ausführen einer Aktualisierungs-/Löschabfrage

Viele Lösungen schlagen vor, @Transactional zu Ihrer Methode hinzuzufügen. Allein dies hat den Fehler nicht geändert.

Einige Lösungen schlagen vor, den EntityManager nach a zu fragen EntityTransaction damit Sie beginnen und sich verpflichten können. Dies wirft einen weiteren Fehler:

verursacht durch: java.lang.IllegalStateException: Es ist nicht erlaubt, eine Transaktion auf einem gemeinsam genutzten EntityManager zu erstellen – verwenden Sie stattdessen Spring-Transaktionen oder EJB CMT

Ich habe dann eine Methode ausprobiert, von der die meisten Websites sagen, dass sie zur Verwendung von anwendungsverwalteten Entitätsmanagern und nicht von Containern verwaltet wird (was meiner Meinung nach Spring ist), und das war joinTransaction().

Haben @Transactional die Methode dekorieren und dann aufrufen joinTransaction() auf dem EntityManager-Objekt kurz vor dem Aufruf query.executeUpdate() und meine native Abfrageaktualisierung funktionierte.

Ich hoffe, dies hilft jemand anderem, der dieses Problem hat.

  • Für diejenigen, die dies lesen, um joinTransaction aufzurufen, tun Sie em.joinTransaction(); (wobei em Ihr EntityManager-Objekt ist) (Außerdem ist eine der Schreibweisen der Funktion in der obigen Antwort schlecht, weshalb Sie in Eclipse die roten Schnörkel erhalten, wenn Sie einfach kopieren/einfügen. Stattdessen können Sie kopieren/ Fügen Sie den Code hier in diesen Kommentar ein.)

    – Michael Tontschew

    9. April 2015 um 15:29 Uhr


  • Bei der dritten Lösung erhalte ich diesen Fehler: org.springframework.dao.InvalidDataAccessApiUsageException: No local transaction to join; Die verschachtelte Ausnahme ist javax.persistence.TransactionRequiredException: Keine lokale Transaktion zum Beitreten

    – Schilan

    26. März 2019 um 13:51 Uhr

  • Ich habe stattdessen die Factory verwendet und in jeder Methode erhalte ich den entityManager und handhabe die Transaktion manuell mit transaction.begin und commit() EntityManager entityManager = entityManagerFactory.createEntityManager();

    – Schilan

    26. März 2019 um 13:57 Uhr

  • Dies sollte als Antwort akzeptiert werden, wenn Sie mit nativen Abfragen spielen, müssen Sie dies tun entityManager.joinTransaction();

    – Danyal Sandeelo

    26. Januar 2020 um 12:18 Uhr


  • Ich war so blind! Danke für diesen Rat … Ich habe nur die @Transactional-Anmerkung vergessen

    – HerTesla

    4. Februar 2020 um 14:00 Uhr

Benutzer-Avatar
Benutzer-8017771

In meinem Fall hatte ich das falsche @Transactional importiert.

Das Richtige ist:

import org.springframework.transaction.annotation.Transactional;

und nicht

import javax.transaction.Transactional;

  • Ich habe es mit beiden versucht (eins nach dem anderen) und es hat mit beiden funktioniert. Die verwendete Spring-Version war 2.2.5.RELEASE. Ich habe den Frühling im Code gelassen.

    – xbranko

    3. November 2021 um 2:12 Uhr

Benutzer-Avatar
Satja P

Ich habe auch das gleiche Problem, wenn ich mit Hibernate und Spring Jpa Data Repository arbeite. Ich habe vergessen zu platzieren @Transactional auf Spring Data Repository-Methode.

Es funktioniert für mich nach dem Kommentieren mit @Transactional.

  • Das hat mir geholfen … Ich brauchte sowohl “@Transactional” als auch “@Modifying” für die JPA-Repository-Methode. Es schien nicht genug zu sein, dies nur in meiner Dienstmethode (die das JPA-Repository aufruft) zu haben.

    – Markus Müller

    18. Mai 2017 um 15:40 Uhr

  • DAS HAT MIR GEHOLFEN. @Transactional war auch für die JPA DAO Repository-Methode erforderlich! Nicht zu fassen! Du bist ein Lebensretter, Satya P!!

    – Gen b.

    16. Dezember 2017 um 20:23 Uhr

  • Einverstanden, dies ist erforderlich, wenn @Modifing-Abfragen verwendet werden.

    – sinedsem

    23. September 2018 um 10:50 Uhr

Benutzer-Avatar
Chetan Verma

Aus der Konfigurations-XML ist klar, dass Sie eine frühlingsbasierte Transaktion verwenden werden. Bitte stellen Sie sicher, dass der Import, den Sie verwenden, für @Transactional ist “org.springframework.transaction.annotation.Transactional”

in deinem Fall könnte es sein “javax.transaction.Transaktional”

Ich habe diese Ausnahme erhalten, als ich versuchte, eine Massen-UPDATE-Abfrage in einem Entitätsmanager ohne JTA (d. h. ressourcenlokal) in Java SE auszuführen. Ich hatte einfach vergessen, meinen JPQL-Code einzufügen

em.getTransaction().begin();

und

em.getTransaction().commit();

Ich habe den gleichen Fehler.

Ich habe gerade die hinzugefügt @Transaktion Anmerkung von javax.transaction.Transaktional auf die Methode.

Aktualisieren:

Ich würde die Verwendung von Spring empfehlen @Transactional Anmerkung von org.springframework.transaction.annotation.Transactional;

Benutzer-Avatar
Shahid Hussein Abbasi

Die Verwendung von @Modifying und @Transaction hat mich behoben

  1. @Modifying @Query(value=”DELETE FROM lock WHERE user_id = ?1″ ,nativeQuery=true) void deleteByUserId(Long userId);

  2. @Service @Transaktional

1298140cookie-checkTransactionRequiredException Ausführen einer Aktualisierungs-/Löschabfrage

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy