java Sping Boot JPA lazy fetch失败,cronjob失败,但控制器没有

iecba09b  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(134)

我有一个名为Candidate的实体,它与另一个表有OneToMany关系:

/**
 * One entry for each right.
 */
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "candidate", orphanRemoval = true)
private List<AccessRight> rights;

这对我的控制器和用Map器类将其序列化为JSON都很好。
但是我现在必须添加一个cronjob来将我的表与另一个系统同步。我得到了错误:
CandidateMapper类中的failed to lazily initialize a collection of role: com.mydomain.Candidate.rights, could not initialize proxy - no Session
当从cron作业查询我的存储库时,我缺少了什么或有什么不同?

hmtdttj4

hmtdttj41#

我设法通过将@Transactional添加到从调度程序调用的服务方法来解决这个问题。

brjng4g3

brjng4g32#

添加@Transactional解决了这个问题,但请记住,它将使所有事情都发生在单个数据库事务中,这可能并不总是理想的,因为它可以锁定行,如果出现错误,需要回滚等。
另一种解决方案是将获取类型更改为EAGER:

@OneToMany(fetch = FetchType.EAGER, ...)

这将产生这样的效果,即在获取Candidate对象的同时,从数据库中获取所有相关的AccessRight right对象。如果你知道你总是需要所有的Candidate s,那么EAGER fetching可能是最好的解决方案,因为它比在Map函数中遇到的每个对象顺序查询数据库要快。

相关问题