web-dev-qa-db-ja.com

TransactionRequiredException更新/削除クエリの実行

こんにちは、springとmongodbでHibernate JPAを使用しています。Glassfish-4.0でアプリケーションを実行しています。

私のサービスクラスは:

@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";        
    }
}

そして、私のspring-context.xmlは次のとおりです:

<?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>

コードにいくつかの変更を適用しましたが、効果はありません。誰でもこれを整理するのを手伝ってください。前もって感謝します。

37
user41498

しかし、これがあなたの状況に役立つかどうかはわかりません(それが存在する場合)。ただし、同様の問題をWebで探した後です。

更新を実行するために、永続性EntityManagerからネイティブクエリを作成していました。

Query query = entityManager.createNativeQuery(queryString);

次のエラーが表示されました。

原因:javax.persistence.TransactionRequiredException:更新/削除クエリの実行

多くのソリューションでは、メソッドに@Transactionalを追加することをお勧めします。これを実行してもエラーは変わりませんでした。

いくつかの解決策は、自分でbeginを呼び出してコミットできるように、EntityManagerにEntityTransactionを要求することを提案しています。これにより、別のエラーがスローされます。

原因:Java.lang.IllegalStateException:共有EntityManagerでトランザクションを作成できません-代わりにSpringトランザクションまたはEJB CMTを使用してください

その後、ほとんどのサイトがコンテナ管理ではなくアプリケーション管理のエンティティマネージャを使用する方法(Springはそうだと思います)を試しましたが、それはjoinTransaction()でした。

メソッドを@Transactionalで装飾し、joinTransaction()を呼び出す直前にEntityManagerオブジェクトでquery.executeUpdate()を呼び出すと、ネイティブクエリの更新が機能しました。

これが他の誰かがこの問題を経験するのを助けることを願っています。

50
Drew Corbin

構成XMLを形成するため、スプリングベースのトランザクションを使用することは明らかです。 @Transactionalに使用しているインポートが"org.springframework.transaction.annotation.Transactional"であることを確認してください

あなたの場合、"javax.transaction.Transactional"

乾杯

チェタンバーマ

25
Chetan Verma

私の場合、間違った@Transactionがインポートされました。正しいものは次のとおりです。

org.springframework.transaction.annotation.Transactional

およびnotjavax.transaction.Transactional

24
User-8017771

HibernateとSpring Jpa Data Repositoryを使用するときにも、同じ問題に直面しました。スプリングデータリポジトリメソッドに@Transactionalを配置するのを忘れました。

@Transactionalで注釈を付けた後、機能します。

15
Satya P

@Transactionalをメソッドからクラスレベルに移動するのはどうですか?似たような場合に私のために働いたが、なぜかは100%確かではない。

5
mvmn

メソッドレベルまたはクラスレベルで@ Transactionalを追加するだけです。レコードを更新または削除するときは、トランザクションの永続状態を維持する必要があり、@Transactionalがこれを管理します。

およびimportorg.springframework.transaction.annotation.Transactional;

4
Deva

Java SEの非JTA(つまり、リソースローカル)エンティティマネージャーで一括UPDATEクエリを実行しようとしたときに、この例外を受け取りました。 JPQLコードをラップするのを忘れていた

em.getTransaction().begin();

そして

em.getTransaction().commit();
4
JL_SO

同じエラーが発生しました。

メソッドに@ Transactionaljavax.transaction.Transactionalの注釈を追加しました。

2
Akshay Pethani

トランザクションの開始と終了について心配する必要はありません。メソッドの開始時にトランザクションを内部的に開き、メソッドの終了時に終了する@Transactionalアノテーションを既に適用しています。したがって、これは、オブジェクトをデータベースに永続化するためにのみ必要です。

 @Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})

         public String persist(Details details){
             details.getUsername();
             details.getPassword();
             Query query = em.createNativeQuery("db.details.find(username= "+details.getUsername()+"& password= "+details.getPassword());

             em.persist(details);
             System.out.println("Sucessful!");
            return "persist";        
     }

編集:問題は設定ファイルにあるようです。JPAを使用している場合、設定ファイルには以下の設定が必要です

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory" />
<bean id="jpaAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:database="Oracle" p:showSql="true" />
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:persistenceUnitName="YourProjectPU"
    p:persistenceXmlLocation="classpath*:persistence.xml"
    p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
    <property name="loadTimeWeaver">
        <bean
            class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
    <property name="persistenceProvider" ref="interceptorPersistenceProvider" />

</bean>
1
DeepInJava

自分のメソッドがpublicだけでなくpublic finalとして宣言されていることに気付くまで、何も機能していないように思われました。エラーはfinalキーワードが原因でした。それを削除すると、エラーはなくなりました。

1
Damir Olejar

クラスレベルで@Transactionalアノテーションを追加し、org.springframework.transaction.annotation.Transactionalをインポートしても、同じエラーに直面していました。

その後、Hibernateクエリを使用していたため、org.hibernate.query.Queryをインポートする代わりにjavax.persistence.Queryをインポートしたことに気付きました。したがって、インポートorg.hibernate.query.Queryを追加します。私のために問題を解決しました。

このアイデアが誰かに役立つことを願っています。

0
Smitha

同じ問題に直面して、@EnableTransactionManagementアノテーションでトランザクション管理を有効にするのを忘れていました。

参照:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/EnableTransactionManagement.html

0

同じ例外に直面しました "TransactionRequiredException更新/削除クエリの実行"ですが、その理由は、春に別のBeanを作成したためですapplicationContext.xmlファイルname "transactionManager" "org.springframework.jms.connection.JmsTransactionManage r"を参照していますが、同じ名前の別のBeanがありました "transactionManagerorg.springframework.orm.jpa.JpaTransactionManager」を参照しています。したがって、JPA BeanはJMS Beanによって上書きされます。

JmsのBean名を変更すると、問題は解決しました。

0
Abdullah

コードの実行中のエラーメッセージ:

javax.persistence.TransactionRequiredException:更新/削除クエリの実行

EntityManagerトランザクションを開始-> createNativeQuery-> updateを実行-> entityManagerトランザクションのコミットをデータベースに保存します。 Hibernateとpostgresqlでうまく機能しています。

コード

entityManager.getTransaction().begin();
Query query = entityManager.createNativeQuery("UPDATE tunable_property SET tunable_property_value = :tunable_property_value WHERE tunable_property_name = :tunable_property_name");
query.setParameter("tunable_property_name", tunablePropertyEnum.eEnableJobManager.getName());
query.setParameter("tunable_property_value", tunable_property_value);
query.executeUpdate();
entityManager.getTransaction().commit();
0
Gourab Paul