TransactionRequiredException 执行更新/删除查询。

18 浏览
0 Comments

TransactionRequiredException 执行更新/删除查询。

我正在使用hibernate JPA与spring和mongodb,我的应用程序在Glassfish-4.0上运行。\n我的服务类是:\n

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

\n而我的spring-context.xml是:\n



    
    
    
    
    
        
        
    
    
        
    
    
    

\n我得到了\"TransactionRequiredException Executing an update/delete query\"的错误。\n如何解决这个错误?

0
0 Comments

出现TransactionRequiredException Executing an update/delete query的原因是在使用Hibernate和Spring Jpa Data Repository时,忘记在spring data repository方法上添加注解。在我添加了这个注解后,问题得到了解决。

这对我非常有帮助...我需要在JPA repository方法上同时添加。仅仅在调用JPA repository的服务方法上添加这个注解似乎不够。

这对我非常有帮助。在JPA DAO Repository方法上也需要添加!真不可思议!你是个救命恩人,Satya P!

同意,如果使用查询的话,是需要添加这个注解的。

0
0 Comments

问题原因:导入的错误的事务注解类。

解决方法:使用正确的事务注解类。

正确的事务注解类为:

import org.springframework.transaction.annotation.Transactional;

而不是:

import javax.transaction.Transactional;

尝试了两种情况(一次只尝试一种情况),两种情况都可以工作。所使用的Spring版本为2.2.5.RELEASE。我将保留代码中的Spring事务注解。

这对我来说是非常宝贵的建议。

0
0 Comments

问题的出现原因是在执行一个更新/删除查询时,缺少事务。解决方法是在方法上添加@Transactional注解,或者在使用EntityManager对象之前调用entityManager.joinTransaction()方法。

以下是整理好的文章:

在使用EntityManager执行一个更新/删除查询时,出现了一个javax.persistence.TransactionRequiredException异常,提示缺少事务。经过查找相关问题的解决方法,我尝试了多种解决方案。

首先,我尝试了在方法上添加@Transactional注解,但这并没有改变错误提示。

然后,我尝试了一种常用于应用程序管理的实体管理器,而不是容器管理的方法,即调用EntityManager的joinTransaction()方法。在调用query.executeUpdate()之前,我在方法上添加了@Transactional注解,并在调用之前调用了entityManager.joinTransaction()方法。这样做后,我的原生查询更新成功了。

值得一提的是,调用joinTransaction()方法需要使用em.joinTransaction()的方式,其中em是你的EntityManager对象。

有一个解决方案提到了使用EntityManagerFactory而不是EntityManager,并在每个方法中手动处理事务,即调用transaction.begin()和transaction.commit()方法。具体实现是通过创建一个EntityManager对象,然后使用它来处理事务。

需要注意的是,在使用原生查询时,你需要调用entityManager.joinTransaction()方法。

在尝试了以上几种方法后,我成功解决了这个问题。希望这篇文章能对遇到相同问题的人有所帮助。

附上一个使用原生查询的示例代码:

(nativeQuery = true, value = "update loan_application set transaction_status = :transaction_status where id =:id") 
void updateLoanApplicationStatus(@Param("transaction_status") int transaction_status, @Param("id") BigInteger id);

0