首页 > 解决方案 > 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

谁能指出问题所在的正确方向?

标签: springmultithreadinghibernatejpaspring-data-jpa

解决方案


@Service通过在 my 's中添加一个简单的事务检查来解决它run(),如下所示:

if (transcription.getId()!=null && transcriptionRepository.existsById(transcription.getId()))
    transcriptionRepository.save(transcription);//session.persist(transcription); 

推荐阅读