有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java TransactionRequiredException执行更新/删除查询

您好,我正在spring和mongodb中使用HibernateJPA,我正在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>

我在代码中应用了一些更改,但它们没有效果。 谁能帮我把这件事弄清楚吗。 提前谢谢


共 (6) 个答案

  1. # 1 楼答案

    作为配置xml的形式,很明显您将使用基于spring的事务。请确保用于@Transactional的导入是“org.springframework.transaction.annotation.Transactional”

    在您的情况下,它可能是“javax.transaction.Transactional”

  2. # 2 楼答案

    使用@Modifying和@Transaction修复了我的问题

    1. @修改 @查询(value=“从锁定中删除,其中用户\u id=?1”,nativeQuery=true) void deleteByUserId(长用户ID)

    2. @服务 @事务性的

  3. # 3 楼答案

    在使用Hibernate和SpringJPA数据存储库时,我也遇到了同样的问题。我忘了在spring数据存储库方法上放置@Transactional

    在用^{注释之后,它对我有效

  4. # 4 楼答案

    我在JavaSE中尝试在非JTA(即资源本地)实体管理器中运行批量更新查询时收到此异常。 我只是忘了把我的JPQL代码包装进去

    em.getTransaction().begin();
    

    em.getTransaction().commit();
    
  5. # 5 楼答案

    就我而言,我导入了错误的@Transactional

    正确的答案是:

    import org.springframework.transaction.annotation.Transactional;
    

    不是

    import javax.transaction.Transactional;
    
  6. # 6 楼答案

    我不确定这是否有助于你的情况(也就是说,如果它仍然存在),然而,在网上搜索类似的问题之后

    我正在从持久性EntityManager创建一个本机查询以执行更新

    Query query = entityManager.createNativeQuery(queryString);
    

    我收到以下错误:

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

    许多解决方案建议在方法中添加@Transactional。 只是这样做并没有改变错误

    一些解决方案建议向EntityManager请求一个EntityTransaction,这样您就可以调用begin并提交自己。 这会引发另一个错误:

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

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

    @Transactional装饰方法,然后在调用query.executeUpdate()之前调用EntityManager对象上的joinTransaction(),我的本机查询更新工作正常

    我希望这能帮助其他遇到这个问题的人