事务需要异常 执行更新/删除查询

2022-08-31 10:01:58

嗨,我正在使用带有spring和mongodb的休眠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";        
    }
}

而我的春天背景.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>

我已经在代码中应用了一些更改,但没有效果。任何人都可以帮我解决这个问题。提前致谢。


答案 1

我不确定这是否有助于您的情况(即如果它仍然存在),但是,在搜索网络以查找类似问题之后。

我正在从持久性实体管理器创建一个本机查询来执行更新。

Query query = entityManager.createNativeQuery(queryString);

我收到以下错误:

原因:javax.persistence.TransactionRequiredException: 执行更新/删除查询

许多解决方案建议在方法中添加@Transactional。仅执行此操作并未更改错误。

一些解决方案建议向 EntityManager 询问 a,以便您可以调用 begin 并提交自己。这将引发另一个错误:EntityTransaction

由以下原因引起:java.lang.IllegalStateException:不允许在共享的 EntityManager 上创建事务 - 使用 Spring 事务或 EJB CMT 代替

然后,我尝试了一种方法,大多数网站都说该方法是用于应用程序管理的实体管理器,而不是容器管理的(我相信Spring是),那就是.joinTransaction()

在调用之前修饰了该方法,然后调用了EntityManager对象,并且我的本机查询更新工作正常。@TransactionaljoinTransaction()query.executeUpdate()

我希望这有助于其他人遇到此问题。


答案 2

在我的情况下,我输入了错误的。@Transactional

正确的是:

import org.springframework.transaction.annotation.Transactional;

而不是

import javax.transaction.Transactional;