こんにちは、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>
コードにいくつかの変更を適用しましたが、効果はありません。誰でもこれを整理するのを手伝ってください。前もって感謝します。
しかし、これがあなたの状況に役立つかどうかはわかりません(それが存在する場合)。ただし、同様の問題を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()
を呼び出すと、ネイティブクエリの更新が機能しました。
これが他の誰かがこの問題を経験するのを助けることを願っています。
構成XMLを形成するため、スプリングベースのトランザクションを使用することは明らかです。 @Transactionalに使用しているインポートが"org.springframework.transaction.annotation.Transactional"であることを確認してください
あなたの場合、"javax.transaction.Transactional"
乾杯
チェタンバーマ
私の場合、間違った@Transaction
がインポートされました。正しいものは次のとおりです。
org.springframework.transaction.annotation.Transactional
およびnotjavax.transaction.Transactional
。
HibernateとSpring Jpa Data Repositoryを使用するときにも、同じ問題に直面しました。スプリングデータリポジトリメソッドに@Transactional
を配置するのを忘れました。@Transactional
で注釈を付けた後、機能します。
@Transactional
をメソッドからクラスレベルに移動するのはどうですか?似たような場合に私のために働いたが、なぜかは100%確かではない。
メソッドレベルまたはクラスレベルで@ Transactionalを追加するだけです。レコードを更新または削除するときは、トランザクションの永続状態を維持する必要があり、@Transactional
がこれを管理します。
およびimportorg.springframework.transaction.annotation.Transactional;
Java SEの非JTA(つまり、リソースローカル)エンティティマネージャーで一括UPDATEクエリを実行しようとしたときに、この例外を受け取りました。 JPQLコードをラップするのを忘れていた
em.getTransaction().begin();
そして
em.getTransaction().commit();
同じエラーが発生しました。
メソッドに@ Transactionaljavax.transaction.Transactionalの注釈を追加しました。
トランザクションの開始と終了について心配する必要はありません。メソッドの開始時にトランザクションを内部的に開き、メソッドの終了時に終了する@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>
自分のメソッドがpublic
だけでなくpublic final
として宣言されていることに気付くまで、何も機能していないように思われました。エラーはfinal
キーワードが原因でした。それを削除すると、エラーはなくなりました。
クラスレベルで@Transactionalアノテーションを追加し、org.springframework.transaction.annotation.Transactionalをインポートしても、同じエラーに直面していました。
その後、Hibernateクエリを使用していたため、org.hibernate.query.Queryをインポートする代わりにjavax.persistence.Queryをインポートしたことに気付きました。したがって、インポートorg.hibernate.query.Queryを追加します。私のために問題を解決しました。
このアイデアが誰かに役立つことを願っています。
同じ問題に直面して、@EnableTransactionManagement
アノテーションでトランザクション管理を有効にするのを忘れていました。
参照:
同じ例外に直面しました "TransactionRequiredException更新/削除クエリの実行"ですが、その理由は、春に別のBeanを作成したためですapplicationContext.xmlファイルname "transactionManager" "org.springframework.jms.connection.JmsTransactionManage r"を参照していますが、同じ名前の別のBeanがありました "transactionManager 「org.springframework.orm.jpa.JpaTransactionManager」を参照しています。したがって、JPA BeanはJMS Beanによって上書きされます。
JmsのBean名を変更すると、問題は解決しました。
コードの実行中のエラーメッセージ:
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();