我有一个名为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作业查询我的存储库时,我缺少了什么或有什么不同?
2条答案
按热度按时间hmtdttj41#
我设法通过将
@Transactional
添加到从调度程序调用的服务方法来解决这个问题。brjng4g32#
添加
@Transactional
解决了这个问题,但请记住,它将使所有事情都发生在单个数据库事务中,这可能并不总是理想的,因为它可以锁定行,如果出现错误,需要回滚等。另一种解决方案是将获取类型更改为EAGER:
这将产生这样的效果,即在获取
Candidate
对象的同时,从数据库中获取所有相关的AccessRight right
对象。如果你知道你总是需要所有的Candidate
s,那么EAGER fetching可能是最好的解决方案,因为它比在Map函数中遇到的每个对象顺序查询数据库要快。