spring-data-jpa REST + Spring Data JPA实体图+未完全加载的实体+缓存

evrscar2  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(211)

加载实体时,如果未完全使用资料档案库查询中的规范和实体图形,则会缓存数据。但仅当通过REST端点调用方法时才缓存数据。如果调用方法时已调度,则一切正常,不会缓存数据。
数据模型:
第一个
有趣的部分:

@RestController
class Controller {

    @Autowired
    lateinit var schoolService: SchoolService

    @GetMapping("/")
    fun query() {
        printSchool()
    }

    @Scheduled(fixedDelay = 5000)
    fun scheduled() {
        printSchool()
    }

    private fun printSchool() {
        val schools = schoolService.crazyStuff()
        println("=crazy stuff= $schools")

        val schools2 = schoolService.allFine()
        println("=all fine= $schools2")
    }
}

业务逻辑是:加载具有类“1C”的所有学校,提取id,然后加载具有这些新id的所有学校。
在REST控制器中,输出为:
=crazy stuff= [School(id=1, name='Goethe-School', classes=1C)]``=crazy stuff= [School(id=1, name='Goethe-School', classes=1C)]
在计划任务中,输出与预期一致:
=crazy stuff= [School(id=1, name='Goethe-School', classes=1D, 1B, 1C, 1A)]=all fine= [School(id=1, name='Goethe-School', classes=1A, 1C, 1B, 1D)]
这种行为的原因是什么?如何禁用缓存未完全加载的实体与规范查询和实体图?

rlcwz9us

rlcwz9us1#

这肯定是由于事务作用域。
这很难确定,但由于您没有事务定义,因此我将假定您使用的是Open Session In View Anti-Pattern
这使得你可以在一个事务中调用REST,因此第一次加载school时,会将其放在一级缓存中,并在随后的调用中返回。
在调度调用中,你根本没有任何显式事务,OSIV也没有任何作用,因为它绑定到了不存在的Web请求。因此,每次调用仓库都会创建和关闭新的事务,每次都要重新创建和销毁一级缓存。因此,你基本上根本没有任何缓存。

相关问题