TransactionRequiredException Executing an update/delete query

JavaSpringHibernateMongodbJpa

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

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.

Solution 2 - Java

In my case, I had the wrong @Transactional imported.

The correct one is:

import org.springframework.transaction.annotation.Transactional;

and not

import javax.transaction.Transactional;

Solution 3 - Java

I have also faced same issue when I work with Hibernate and Spring Jpa Data Repository. I forgot to place @Transactional on spring data repository method.

Its working for me after annotating with @Transactional.

Solution 4 - Java

as form the configuration xml it is clear that you are going to use spring based transaction. Please make sure that the import which you are using for @Transactional is "org.springframework.transaction.annotation.Transactional"

in your case it might be "javax.transaction.Transactional"

Solution 5 - Java

I received this exception when trying to run a bulk UPDATE query in a non-JTA (i.e. resource-local) entity manager in Java SE. I had simply forgotten to wrap my JPQL code in

em.getTransaction().begin();

and

em.getTransaction().commit();

Solution 6 - Java

Using @Modifying and @Transaction fixed me

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

  2. @Service @Transactional

Solution 7 - Java

I Got the same error.

I just added the @Transactional annotation of javax.transaction.Transactional on the method.

Update:

I would recommend using Spring's @Transactional annotation from org.springframework.transaction.annotation.Transactional;

Solution 8 - Java

How about moving @Transactional from method to class level? Worked for me in similar case, though I'm not 100% certain why.

Solution 9 - Java

Just add @Transactional on method level or class level. When you are updating or deleting record/s you have to maintain persistence state of Transaction and @Transactional manages this.

and import org.springframework.transaction.annotation.Transactional;

Solution 10 - Java

You need not to worry about begin and end transaction. You have already apply @Transactional annotation, which internally open transaction when your method starts and ends when your method ends. So only required this is to persist your object in database.

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

EDIT : The problem seems to be with your configuration file. If you are using JPA then your configuration file should have below configuration

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

Solution 11 - Java

Nothing seemed to work for me until I realized that my method was declared as public final instead of just public. The error was being caused by the final keyword. Removing it made the error go away.

Solution 12 - Java

Faced the same problem, I simply forgot to activate the transaction management with the @EnableTransactionManagement annotation.

Ref:

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

Solution 13 - Java

Using @PersistenceContext with @Modifying as below fixes error while using createNativeQuery

    import org.springframework.data.jpa.repository.Modifying;
    import org.springframework.transaction.annotation.Transactional;

    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    @Transactional
    @Modifying
    public <S extends T> S save(S entity) {
         Query q = entityManager.createNativeQuery(...);
         q.setParameter...
         q.executeUpdate();
         return entity;
    }

Solution 14 - Java

After integrating Spring 4 with Hibernate 5 in my project and experiencing this problem, I found that I could prevent the error from appearing by changing the way of getting the session from sessionFactory.openSession() to sessionFactory.getCurrentSession(). the proper way to work out this bug may be keep using the same session for the binding transaction.opensession will always create a new session which doesnt like the former one holding a transaction configed.using getCurrentSession and adding additional property <property name="current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</property> works fine for me.

Solution 15 - Java

Error message while running the code:

> javax.persistence.TransactionRequiredException: Executing an > update/delete query

Begin the entityManager transaction -> createNativeQuery -> execute update -> entityManager transaction commit to save it in your database. It is working fine for me with Hibernate and postgresql.

Code

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();

Solution 16 - Java

The same exception occurred to me in a somewhat different situation. Since I've been searching here for an answer, maybe it'll help somebody.

I my case the exception has been happening because I called the (properly annotated) @Transactional method from a SERVICE CONSTRUCTOR... Since my idea was simply to make this method run at the start, I annotated it as following, and stopped calling in a wrong way. Exception is gone, and code is better :)

@EventListener(ContextRefreshedEvent.class)
@Transactional
public void methodName() {...}

@Transactional import: import org.springframework.transaction.annotation.Transactional;

Solution 17 - Java

I faced the same exception "TransactionRequiredException Executing an update/delete query" but for me the reason was that I've created another bean in the spring applicationContext.xml file with the name "transactionManager" refering to "org.springframework.jms.connection.JmsTransactionManager" however there was another bean with the same name "transactionManager" refering to "org.springframework.orm.jpa.JpaTransactionManager". So the JPA bean is overriten by the JMS bean.

After renaming the bean name of the Jms, issue is resolved.

Solution 18 - Java

I was facing the same error inspite of adding @Transactional annotation at class level and importing org.springframework.transaction.annotation.Transactional.

Then I realized that since I was using hibernate query, I had imported javax.persistence.Query instead of import org.hibernate.query.Query. Therefore adding import org.hibernate.query.Query solved the issue for me.

I hope this idea helps someone.

Solution 19 - Java

I was also getting this issue in springboot project and added @Transactional in my class and it is working.

import org.springframework.transaction.annotation.Transactional;
@Transactional
public class SearchRepo {
---
}

Solution 20 - Java

Following advice from Baeldung JPA Transaction Required Exception

Basically wrap your commit code in

Transaction transaction = session.beginTransaction();
....update or save or delete here
transaction.commit();

Solution 21 - Java

I faced the same exception and Loop through save entity like:

relationships.stream().parallel().forEach

modify as:

  relationships.forEach

now it was working。

Solution 22 - Java

If the previous answers fail, make sure you use @Service stereotype for the class where you call the update method on your repository. I originally used @Component instead and it was not working, the simple change to @Service made it work.

Solution 23 - Java

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;


	@Transactional
	public int changepassword(String password, long mobile) {
		// TODO Auto-generated method stub
		session = factory.getCurrentSession();
		Query query = session.createQuery("update User u set u.password='" + password + "' where u.mobile=" + mobile);
		int result = query.executeUpdate();

		return result;
	}
add this code 200% it will work... might scenario is diff but write like this:)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser41498View Question on Stackoverflow
Solution 1 - JavaDrew CorbinView Answer on Stackoverflow
Solution 2 - JavaUser-8017771View Answer on Stackoverflow
Solution 3 - JavaSatya PView Answer on Stackoverflow
Solution 4 - JavaChetan VermaView Answer on Stackoverflow
Solution 5 - JavaJL_SOView Answer on Stackoverflow
Solution 6 - JavaShahid Hussain AbbasiView Answer on Stackoverflow
Solution 7 - JavaAkshay PethaniView Answer on Stackoverflow
Solution 8 - JavamvmnView Answer on Stackoverflow
Solution 9 - JavaDevaView Answer on Stackoverflow
Solution 10 - JavaDeepInJavaView Answer on Stackoverflow
Solution 11 - Java3xCh1_23View Answer on Stackoverflow
Solution 12 - JavaJonathan POIRIERView Answer on Stackoverflow
Solution 13 - JavafortmView Answer on Stackoverflow
Solution 14 - Java何德福View Answer on Stackoverflow
Solution 15 - JavaGourab PaulView Answer on Stackoverflow
Solution 16 - JavadevagaView Answer on Stackoverflow
Solution 17 - JavaAbdullahView Answer on Stackoverflow
Solution 18 - JavaSmithaView Answer on Stackoverflow
Solution 19 - JavaalokView Answer on Stackoverflow
Solution 20 - JavaTung Anh NguyenView Answer on Stackoverflow
Solution 21 - JavajackView Answer on Stackoverflow
Solution 22 - JavaGeorgeeView Answer on Stackoverflow
Solution 23 - JavaSajjad Ali KhanView Answer on Stackoverflow