使用 CriteriaQuery 实现存储库,加载属于父子结构一部分的实体。当并行调用使用此存储库的 Web 服务并在业务逻辑中递归地延迟加载已加载实体的父级时,会不规则地出现具有不匹配 JdbcValuesSourceProcessingState 的 Illegal pop() 异常。异常的调用堆栈指向加载父级的行。 REST Web 服务使用 @Transactional(readOnly = true,propagation = Propagation.REQUIRES_NEW) 进行注释。所有涉及的类都被注释为某种具有默认范围的组件,并使用 REQUIRED 的默认 @Transactional 范围。
让父母急切地装车并不能解决问题。将存储库重写为 JpaRepository。但如果我同时执行这两个操作,问题将不再重现。科技。堆栈:spring-boot 3.1.4、hibernate 6.4.1、java 17、docker。
我不像其他类似问题那样使用 Uni<> 或 quarkus:
非法 pop() 与不匹配的 JdbcValuesSourceProcessingState
Hibernate 6 错误 InvalidDataAccessApiUsageException:非法 pop() 与不匹配的 JdbcValuesSourceProcessingState
我的理解是这个异常是由于以非线程安全的方式使用EntityManager引起的。因此,我认为使用设计为线程安全的 JpaRepository 解决方案应该可以解决问题,并且我不需要急切地加载父级。有人可以解释一下为什么在实体管理器的线程安全使用中会发生此异常吗?
提前致谢, 本
@Column(name=xxx)
注释。我启用
spring.jpa.show-sql
并查看发送到数据库的内容。我尝试运行它,但我看到 Hibernate 调用了错误的字段