所以我有这个@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
有人能指出问题所在的正确方向吗?
发布于 2020-08-16 16:30:25
通过在我的@Service的run()中添加一个简单的事务检查来解决这个问题,如下所示:
if (transcription.getId()!=null && transcriptionRepository.existsById(transcription.getId()))
transcriptionRepository.save(transcription);//session.persist(transcription); https://stackoverflow.com/questions/63437567
复制相似问题