当前位置: 首页 > 知识库问答 >
问题:

javax.persistence.TransactionRequiredException错误:jpa 2 hibernate-Native Query

金慈
2023-03-14

当我尝试更新狮身人面像实时索引时,我收到上述错误。由于sphinx使用非常接近mysql的数据库,因此我正在尝试使用实体管理器来更新索引。但是sphinxql不是一个完整的mysql数据库,所以如果我使用entitymanager.merge方法,sphinxql无法理解生成的sql。因此,我决定使用 createNativeQuery 插入新索引或从实时索引中删除索引。但是,当我调用createNativeQuery的.executeUpdate方法时,我在标题中遇到异常。

这是我的刀:

public interface RTIndexGeoDao {

    public boolean deleteIndex(long id);

    public boolean insertIndex(long id, long agentActivityId, long agentId, double latitude, double longitude);
}

这是我对 Dao 的实现:

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

import org.springframework.stereotype.Repository;

@Repository(value = "rtIndexGeoDao")
public class JPARTIndexDao implements RTIndexGeoDao {

    private EntityManager em;

    @PersistenceContext(unitName = "rtIndexPU")
    public void setRtIndexEntityManager(EntityManager em)
    {
        this.em = em;
    }

    public boolean deleteIndex(long id) {
        //This is to update our geodistance index
        try
        {
            this.em.createNativeQuery("delete from rt_geo where agent_agent_id = ?1").setParameter(1, id).executeUpdate();


            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

    public boolean insertIndex(long id, long agentActivityId, long agentId,
            double latitude, double longitude) {
        try
        {
            this.em.createNativeQuery("insert into rt_geo(id, agent_activity_id, agent_agent_id, latitude, longitude) values(?1, ?2, ?3, ?4, ?5)")
            .setParameter(1, id)
            .setParameter(2, agentActivityId)
            .setParameter(3, agentId)
            .setParameter(4, latitude)
            .setParameter(5, longitude).executeUpdate();

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

}

这是我的RTIndexManager:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springtest.mavenspringapp.repository.RTIndexGeoDao;

@Component
@Transactional
public class SphinxRTIndexManagerImpl implements SphinxRTIndexManager {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Autowired
    private RTIndexGeoDao rtIndexGeoDao;

    public boolean deleteIndex(long id) {
        return rtIndexGeoDao.deleteIndex(id);
    }

    public boolean insertIndex(long id, long agentActivityId, long agentId,
            double latitude, double longitude) {
        return rtIndexGeoDao.insertIndex(id, agentActivityId, agentId, latitude, longitude);
    }

}

这是我的坚持.xml

<persistence-unit name="rtIndexPU" transaction-type="RESOURCE_LOCAL">
    </persistence-unit>

这是控制器:

@Autowired
    private SphinxRTIndexManager rtIndexManager;
private AgentActivity createActivity(Agent agent, double latitude, double longitude, String agentActivityDescription)
    {
//Steps to update indexes
        boolean deleteEntry = rtIndexManager.deleteIndex(agent.getAgentId());
        if (!deleteEntry) return null;

更新:我正在发布我的applicationContext.xml

<!-- enabling annotation driven configuration /-->
    <context:annotation-config/>
<bean id="rtIndexEntityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:dataSource-ref="rtIndexDataSource"
        p:jpaVendorAdapter-ref="jpaAdapter">
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property>                             
        <property name="persistenceUnitName" value="rtIndexPU"></property>
    </bean>

<bean id="rtIndexTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="rtIndexEntityManagerFactory"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory"/>

我有另一个持久化单元,每个管理器、道等都有效。但是当我在持久化上下文为rtIndexPU的entityManager上使用createNativeQuery.executeUpdate时,会出现此异常:

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

我已经搜索了互联网上的所有问题,但无法解决这个问题。提前感谢。

共有1个答案

李星辰
2023-03-14

由于您的代码中有两个事务管理器,问题很可能是您的<code>SphinxRTIndexManagerImpl<code>没有使用正确的事务管理器(或任何事务管理器)。

您应该将代码更改为:

@Component
@Transactional("rtIndexTransactionManager")
public class SphinxRTIndexManagerImpl implements SphinxRTIndexManager {

}

您还必须配置第二个事务管理器(rtIndexTransactionManager)来处理注释,方法是:

<tx:annotation-driven transaction-manager="rtIndexTransactionManager"/>
 类似资料:
  • 问题内容: 我试图从一个小的facelet应用程序中将一些值持久化到MySql数据库中,但一直收到此错误。我有一个具有JPS页面和servlet的相同应用程序,并且在大致相同的逻辑下也可以正常工作,这是我第一次尝试使用facelets,因此可能只是愚蠢的事情,但我会寻求帮助。 谢谢 错误 index.xhtml BookController.java Book.java percistence.x

  • 问题内容: When I call: 我得到标题中提到的异常。 我正在使用Hibernate JPA。 问题答案: 在我自己遇到这个问题并花了几个小时试图解决这个问题之后,我终于找到了一个原因:Spring有一个错误,并且@如果同一类具有用于自动装配的注释,则无法维护带有注释的事务。 一旦从相关服务类中删除了注释,并且在XML配置中声明了一个适当的bean: 问题解决了。

  • 我正在尝试搜索亚马逊的产品广告,并使用botlenose来帮助我做到这一点。但是,我刚刚收到HTTP错误400。 其他一些重要信息: 我来自巴西,我的标签也来自亚马逊。这是个问题吗? 我确实检查了我的钥匙、秘密和标签,一切正常。我确实在StackOverflow上查看了其他一些问题,但对我来说没有任何效果。 当然,出于安全原因,我更改了密钥。 Traceback(最近一次调用最后一次):File"

  • 我有一个基于Spring Web model view controller(MVC)框架的项目。Spring Web模型-视图-控制器(MVC)框架的版本是3.2.8 我有这个控制器 这个URL一切正常:

  • 目前从Angular JS controller中,我试图将JSON数据发送到后端服务。但是我有400个错误的请求错误。 在Controller中,我试图通过http服务发送数据,如下所示:

  • 我得到了这个错误,有什么想法会导致它吗?我试图发送一个DTO,它有一个扩展抽象类的对象列表,我想这个问题可能是因为DTO中的列表,还是因为抽象类的子类?