gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:40:49 25 4
gpt4 key购买 nike

当我尝试更新 sphinx 实时索引时出现上述错误。由于 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);
}

}

这是我的persistence.xml

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

这是 Controller :

@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"/>

我有另一个持久化单元,每个 manager、dao 等都可以工作。但是当我在 persistenceContext 为 rtIndexPU 的 entitymanager 上使用 createNativeQuery.executeUpdate 时,出现了这个异常:

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

我已经搜索了互联网上的每个可用问题,但无法解决此问题。提前致谢。

最佳答案

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

您应该将代码更改为:

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

}

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

<tx:annotation-driven transaction-manager="rtIndexTransactionManager"/>

关于javax.persistence.TransactionRequiredException 错误 : jpa 2 + hibernate - Native Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com