Spring data jpa 在非常具体的场景中抛出 TransientObjectException

Posted

技术标签:

【中文标题】Spring data jpa 在非常具体的场景中抛出 TransientObjectException【英文标题】:Spring data jpa throws TransientObjectException on a very specific scenario 【发布时间】:2019-09-22 14:26:36 【问题描述】:

使用 spring-boot (2.1.8.RELEASE),我有一个看起来像这样的测试:

    @Test
    @Transactional
    public void myTest() 
        Company updatedCompany = companyRepository.save(company);

        em.detach(updatedCompany);

        // (1)
        companyRepository.getOne(updatedCompany.getId());

        // (2)
        companyRepository.save(updatedCompany);
    

地点:

company 被初始化为域实体。 emEntityManagercompanyRepository 扩展 JpaRepository<Company, Long>, JpaSpecificationExecutor<Company>

这会在(2) 线上抛出一个TransientObjectException

但是,将行 (1) 替换为 companyRepository.findById(updatedCompany.getId()).get() 会使一切运行无异常。

这不是实际测试,而是我试图理解的代码中重现的问题。

更多版本:

spring-data-jpa: 2.1.10.RELEASE 休眠核心:5.3.11.Final hibernate-entitymanager: 5.3.11.Final

【问题讨论】:

这不是一个解决方案,但你不需要 @Transactional 在测试课上 正如我所说,这是复制,不是实际测试 【参考方案1】:

经过一番研究,似乎是由:https://hibernate.atlassian.net/browse/HHH-13590引起的。

升级 hibernate-core 到 5.3.12.Final 解决了这个问题。

【讨论】:

以上是关于Spring data jpa 在非常具体的场景中抛出 TransientObjectException的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data Jpa 使用@Query标注自定义查询语句

Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍

spring data jpa使用spring data jpa时,关于service层一个方法中进行删除和插入两种操作在同一个事务内处理

Spring Data JPA 之 原生SQL使用

Spring Data JDBC / Spring Data JPA 与 Hibernate

Spring Data JPA:使用连接表进行排序和分页