[问题] Spring Data JPA no Session问题

楼主: jtorngl (Pedrosa go!)   2022-05-06 12:54:33
※问题类别: Spring Data JPA
※系统环境: bellsoft-jdk-11.0.14.1
很久没有使用 JPA,最近可能会用到
又回头看了 Spring Data JPA
一开始使用 Spring Boot 练习
第一问题通常会遇到 infinite recursion 的 JsonMappingException
所以使用 Jackson 的各种 annotation 或是转 DTO 来解
因为觉得 Spring Boot 背后做太多事,可能会错过什么
所以改用 Spring 来练习一下
果不其然就发生了 LazyInitializationException - no Session
查了一下,Spring Boot 的 spring.jpa.open-in-view 默认为 true
让 entity 在脱离 transaction scope 时
还能使用 oiv 的 connection 去查 lazy entity 的资料
不过查资料时,是建议关闭这个功能,毕竟拉长占用 connection 的时间
而查到的几种解法
1. 把 @Transactional 设定在操作 lazy entity 的 method
因为 Spring Data JPA 执行流程,会导到 SimpleJpaRepository 来处理
而 SimpleJpaRepository 在 class 上宣告了 @Transactional(readOnly = true)
因为练习的 service 内的 method,可能会查询多次
不希望每个查询都使用一个 read only transaction
所以在 XxxService 的 class 也使用 @Transactional(readOnly = true)
希望多个查询使用同一个 read only transaction
所以我在 XxxService 的 class 上也使用 @Transactional(readOnly = true)
然后在执行 insert, update, delete 的 method 使用 @Transactional
https://imgur.com/2nVTBXH
但如果要使用 @Transactional 来解 no Session 的错误
那就变成要把 @Transactional 设定在 controller 的 method 了
这和 open-in-view 的做法似乎差别不大,只是用同一个 connection 而已?
2. 把 entity 关联设为 FetchType.EAGER
即使没用到,也强制查询关联的 table,应该也不会这样使用
3. Spring Boot 设定 hibernate.enable_lazy_load_no_trans=true
(Spring 的话,在设定 EntityManagerFactory 时,设定 jpa properties)
似乎也是 Hibernate 实做,另开个 Session 查询 lazy entity
作者: ssccg (23)   2022-05-06 14:30:00
transaction又不是spring data jpa才有的东西,lazy关联不过就是个抽象化的query,不管是用jpa还是从底层driver自己写,都一样要自己决定这个query要在哪个transaction执行啊要像看起来一样方便就open-in-view,从上到下都用entity不然总是要自己决定transaction要包到哪,在这之上就不去乱用entity关联,而是明确重下一次query。而且包到哪应该是从资料是否需要transaction决定,不是api操作方不方便决定至于DTO,主要还是因为要用DTO才用,标志transaction分界只是顺便而已
作者: ntpuisbest (阿龙)   2022-05-06 18:45:00
关联很多实务上很多都是用jdbc template吧
作者: ssccg (23)   2022-05-06 19:03:00
我个人DTO用mapstruct,transaction通常只开到我自己的Repository层(在这里面才再看情用jpa/jdbc),出了这层就是DTO,会分有加载关联和没有的API不过基本上这问题还是看你做的系统需求,就像你说的本来就是个很浅的data service就没差
作者: Jichang (C.C.Lemon)   2022-05-15 02:47:00
不用open session 可以用Hibernate.initialize也可以batch query 出来塞进去

Links booklink

Contact Us: admin [ a t ] ucptt.com