简体   繁体   English

HIBERNATE:TransactionRequiredException:在entityManager.createNativeQuery()之后执行更新/删除查询

[英]HIBERNATE : TransactionRequiredException: Executing an update/delete query after entityManager.createNativeQuery()

I'm working on a project using Struts, Spring and Hibernate. 我正在使用Struts,Spring和Hibernate进行项目。 After clicking on a button, the Struts action leads me through a DS and DAO, in which I try to call a native query to update the DB. 单击按钮后,Struts动作将引导我完成DS和DAO,在其中我尝试调用本地查询来更新数据库。 Here is the error trace: 这是错误跟踪:

javax.persistence.TransactionRequiredException: Executing an update/delete query javax.persistence.TransactionRequiredException:执行更新/删除查询

at org.hibernate.ejb.QueryImpl.executeUpdate(QueryImpl.java:48) 在org.hibernate.ejb.QueryImpl.executeUpdate(QueryImpl.java:48)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:618) 在java.lang.reflect.Method.invoke(Method.java:618)

at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:310) 在org.springframework.orm.jpa.SharedEntityManagerCreator $ DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:310)

at $Proxy496.executeUpdate(Unknown Source) 在$ Proxy496.executeUpdate(未知来源)

at com.my.project.MyDAO.unsubscribe(MyDAO.java:307) 在com.my.project.MyDAO.unsubscribe(MyDAO.java:307)

at com.my.project.MyDS.unsubscribe(MyDS.java:507) 在com.my.project.MyDS.unsubscribe(MyDS.java:507)

at com.my.project.MyDS.updateValue(MyDS.java:784) 在com.my.project.MyDS.updateValue(MyDS.java:784)

at com.my.project.MyAction.handleUpdate(MyAction.java:235) 在com.my.project.MyAction.handleUpdate(MyAction.java:235)

MyDAO : MyDAO:

public class MyDAO extends
    AbstractDAOGenericImpl<MyEntity> {

    /** Entity Manager */
   @PersistenceContext(unitName = "myPersistenceUnit")
   private EntityManager entityManager;

    @Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
    public int unsubscribe(String entityId) throws JrafDaoException {
        StringBuilder strQuery = new StringBuilder();
        strQuery.append("update MYENTITY set SUBSCRIBE=:subscribe where ENTITY_ID=:entity_id");

        final Query myQuery = getEntityManager().createNativeQuery(strQuery.toString(), MyEntity.class);
        myQuery.setParameter("subscribe", "N");
        myQuery.setParameter("entity_id", entityId);

        try {
            return myQuery.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }
}

In MyDS : MyDS中:

@Autowired
@Qualifier("MyDAO")
private MyDAO myDao;

@Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
public int unsubscribe(String entityId) throws JrafDomainException {
    return myDao.unsubscribe(entityId);
}

MyAction : MyAction:

public class MyAction extends DispatchAction {

    private MyDS myDS;

    // ...

    private ActionForward handleUpdate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        MyForm myForm = (MyForm) form;
        myDS.unsubscribe(myForm.getEntityId());
    }
}

And application-context-spring.xml : application-context-spring.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">

    <!-- Enterprise layer's dependencies -->

    <bean id="springLocator"
        class="com.jraf.bootstrap.locator.SpringLocator">
    </bean>

    <!-- To precise the persistence configuration name file -->
    <bean id="persistenceUnitManager"
        class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
        <property name="persistenceXmlLocations">
            <list>
                <value>/META-INF/persistence-web.xml</value>
            </list>
        </property>
    </bean>

    <!-- EntityManagerFactory definition : JPA one -->
    <bean id="myEmf"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitManager"
            ref="persistenceUnitManager" />
        <property name="persistenceUnitName" value="myPersistenceUnit" />
    </bean>

    <!-- TransactionManager JPA one -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="myEmf" />
    </bean>

    <!-- EntityManagerFactory definition : JPA one -->
    <bean id="myEmf2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitManager" ref="persistenceUnitManager" />
        <property name="persistenceUnitName" value="myPersistenceUnit2" />
    </bean> 

    <!-- Transaction Manager definition : JPA one-->
    <bean id="myTxManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="myEmf2" />
    </bean> 

    <!-- Enable annotation usage for transaction -->
    <tx:annotation-driven transaction-manager="transactionManager" />   

    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">      
    <property name="corePoolSize" value="1" />      
    <property name="maxPoolSize" value="1" />      
    <property name="queueCapacity" value="1" /> 
    </bean> 

    <bean id="myDS" class="com.my.internal.MyDS">
        <property name="myDao" ref="MyDAO"/>
    </bean>

    <!-- Enable the annotation usage (bean injection for instance) -->
    <context:annotation-config />
</beans>

I'm working on an existing project which is why the unsubscribe function already exists and uses a native query instead of a HQL one. 我正在处理一个现有项目,这就是为什么取消订阅功能已经存在并且使用本机查询而不是HQL的原因。 But maybe I should use it instead...? 但是也许我应该改用它...?

Thanks for your help. 谢谢你的帮助。

I also faced the similar issue. 我也面临类似的问题。 Adding 新增中

tx:annotation-driven transaction-manager="transactionManager"

to your spring context xml will resolve the issue. 弹簧上下文xml将解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 TransactionRequiredException:执行和更新/删除查询 - TransactionRequiredException:Executing and Update/Delete query TransactionRequiredException 执行更新/删除查询 - TransactionRequiredException Executing an update/delete query 使用entityManager.createNativeQuery(query,foo.class) - use of entityManager.createNativeQuery(query,foo.class) 如何不替换EntityManager.createNativeQuery()中的命名参数? - How to not replace named parameters in EntityManager.createNativeQuery()? entityManager.createNativeQuery 不返回输入结果 - entityManager.createNativeQuery does not return a typed result Java Hibernate 创建本机查询 javax.persistence.TransactionRequiredException:执行更新/删除查询 - Java Hibernate Create Native Query javax.persistence.TransactionRequiredException: Executing an update/delete query 使用 JPA hibernate 更新数据库时,有没有办法消除“TransactionRequiredException:执行更新/删除查询”错误? - Is there a way to eliminate the 'TransactionRequiredException: Executing an update/delete query' error when updating a database using JPA hibernate? 不活跃的transaciotn:javax.persistence.TransactionRequiredException:执行更新/删除查询 - Not active transaciotn: javax.persistence.TransactionRequiredException: Executing an update/delete query Spring 引导:javax.persistence.TransactionRequiredException:使用 @Transactional 注释时执行更新/删除查询 - Spring Boot : javax.persistence.TransactionRequiredException: Executing an update/delete query When Using @Transactional Annotation 为什么我的交易不活跃? javax.persistence.TransactionRequiredException:执行更新/删除查询 - Why is my transaction not active? javax.persistence.TransactionRequiredException: Executing an update/delete query
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM