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
被初始化为域实体。
em
是 EntityManager
。
companyRepository
扩展 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层一个方法中进行删除和插入两种操作在同一个事务内处理