Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TransactionRequiredException Executing an update/delete query

Hi I am using hibernate JPA with spring and mongodb and i am running my application on Glassfish-4.0.

My service class is :

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

And my spring-context.xml is :

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

I have applied some changes in the code but their is no effect. Can anyone please help me to sort out this. Thanks in advance.

like image 918
user41498 Avatar asked Sep 13 '14 09:09

user41498


1 Answers

I am not sure if this will help your situation (that is if it stills exists), however, after scouring the web for a similar issue.

I was creating a native query from a persistence EntityManager to perform an update.

Query query = entityManager.createNativeQuery(queryString); 

I was receiving the following error:

caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query

Many solutions suggest adding @Transactional to your method. Just doing this did not change the error.

Some solutions suggest asking the EntityManager for a EntityTransaction so that you can call begin and commit yourself. This throws another error:

caused by: java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead

I then tried a method which most sites say is for use application managed entity managers and not container managed (which I believe Spring is) and that was joinTransaction().

Having @Transactional decorating the method and then calling joinTransaction() on EntityManager object just prior to calling query.executeUpdate() and my native query update worked.

I hope this helps someone else experiencing this issue.

like image 133
Drew Corbin Avatar answered Sep 29 '22 10:09

Drew Corbin