当id
与数据库中的表单修订版匹配时,以下代码抛出NullPointerException:
@Transactional(readOnly = true)
public FormRevision getFormRevision(Long id) {
FormRevision formRevision = formRevisionDao.findOne(id);
formRevision.fillLazyCollections();//NullPointerException happens here for some form revisions
return formRevision;
}
这是因为formRevisionDao.findOne(id)
正在为某些表单修订返回null
。对于每个表单修订都不会发生这种情况,但对于它确实发生的情况是一致的,并且每次都会失败。
其他信息:
formRevisionDAO对象由Hibernate自动生成,如下所示
@Repository()
public interface IFormRevisionDAO extends JpaRepository<FormRevision, Long> {}
生成的hibernate查询看起来不会导致原因。它只剩下外连接,而where子句只是“id =?”。此外,此查询适用于其他表单修订。
它似乎也不是缓存问题,因为我从FormRevision对象中删除了缓存并且问题仍然存在。
最奇怪的是,如果您调试代码,第一个formRevisionDao.findOne(id)
将返回null。但是,后续相同的调用将返回预期的对象。
我不确定还有什么可能导致这种情况。可能是同步或Hibernate版本问题(目前使用Hibernate 4.1.12并将其与“Oracle数据库10g版本10.2.0.4.0 - 64位生产”一起使用)?
非常感谢任何帮助/见解!
答案 0 :(得分:0)
根据Spring Data doc,findOne:
返回:具有给定id的实体,如果没有找到则返回null
抛出:IllegalArgumentException - 如果id为null
因此,只有在找不到条目时才返回null。保持一致并始终返回null,这加强了没有找到记录的结论。获取相同的数据库凭据并打开SQL控制台并检查丢失的记录查询。