spring - Hibernate x Multithreading = org.hibernate.HibernateException:实例的标识符从 97 更改为 96
问题描述
所以我有这个@Controller
方法,它调用我的@Service
(它实现Runnable
并有一个@Repository
自动装配的)方法来持久化一个新的@Entity Transcription
.
@Controller
的方法
public void serviceMethod() {
Transcription transcription = new Transcription();
transcription.setBotOutput(chatBot.getText());
transcription.setCustomerInput(request);
transcription.setDtime(new Timestamp(System.currentTimeMillis()));
transcription.setSessionId(chatBot.getSessionId());
transcription.setStatus(chatBot.getStatus());
transcription.setTopic(chatSession.predicates.get("topic"));
transcription.setIsUnderstand(isUnderstand);
transcription.setSessionsId(chatSession.getId());
transcriptionService.setTranscription(transcription);
Thread t = new Thread(transcriptionService);
t.start();
t.join();
}
@Service
@Override
@Transactional
@Async
public void run()
{
try {
transcriptionRepository.save(transcription);//session.persist(transcription);
} catch (HibernateException ex)
{
logger.error("HibernateException : " + ex, ex);
}
}
@Repository
@Repository
@Scope("prototype")
public interface TranscriptionRepository extends JpaRepository<Transcription, Long> {
List<Transcription> findAllBySessionId(String sessionId);
}
我面临的问题是当我对其进行负载测试时(jMeter
) - 有时会出现异常:
org.hibernate.HibernateException:pl.sprint.chatbot.db.Transcription 实例的标识符从 97 更改为 96
谁能指出问题所在的正确方向?
解决方案
@Service
通过在 my 's中添加一个简单的事务检查来解决它run()
,如下所示:
if (transcription.getId()!=null && transcriptionRepository.existsById(transcription.getId()))
transcriptionRepository.save(transcription);//session.persist(transcription);
推荐阅读
- java - 两个互斥数据源上的 Spring data jpa
- sql-server - 直接通过SQL修改报表订阅参数
- visual-studio-code - 是否可以在侧边栏中添加自己的内容
- node.js - 使用 React Native 的 GridDB 离线优先模式
- python - 如何使用 BERT 对相似的句子进行聚类
- haskell - 缺少的 << 运算符
- chatbot - 刚开始使用 Botium,正在研究 GitHub 上提供的用于 utterance 的示例,不工作
- python - 在训练卷积神经网络 (DenseNet) 时,是否可以更改任何选项或参数以减少训练时间?
- c# - AJAX 成功的未定义结果
- python - python无法打印日期时间信息