Hibernate findOne第一次不起作用

时间:2014-08-14 21:11:51

标签: java hibernate

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位生产”一起使用)?

非常感谢任何帮助/见解!

1 个答案:

答案 0 :(得分:0)

根据Spring Data doc,findOne:

  

返回:具有给定id的实体,如果没有找到则返回null

     

抛出:IllegalArgumentException - 如果id为null

因此,只有在找不到条目时才返回null。保持一致并始终返回null,这加强了没有找到记录的结论。获取相同的数据库凭据并打开SQL控制台并检查丢失的记录查询。