2

我使用spring data jpa编写了一个带有spring boot的Web服务以实现持久性。Web 服务有一些静态对象(在 Singleton Bean 中),它们需要定期备份到我的数据库中。

有时!(这很糟糕......我真的不知道会发生什么)当我打电话时

ObjectType updated = myRepository.save(existingObject)

我得到一个 java.lang.NullPointerException - 没有可用的堆栈跟踪,因为这样做的方法是通过 @Scheduled 运行的。我尝试调试,existingObject 似乎绝对没问题。仅当existingObject 实际上不是新对象时(即当id != 0)时才会发生错误

PS 我正在使用 Spring Boot,因此并没有真正使用 EntityManager。我只使用@Autowired myRepository。

4

2 回答 2

2

我看到类似的事情正在发生。在保存期间,似乎从 DB 中重新获取了对象(也许是为了查看哪些字段已更改?)但未加载 ManyToOne 关系(即使 FetchType 显式设置为 EAGER)。出于某种原因,在关系上调用了 compareTo。相关对象不是空的,但它只填充了它的 ID(可能是因为从数据库中获取的对象中可用)。所有其他字段为空。当 compareTo 完成它的工作时,NullPointerException 随之而来。

至于实际的解决方案,我还不知道,因为我预计 FetchType EAGER 会确保加载关系。希望这可以帮助某人进一步找到根本原因。

(我会将此添加为评论,因为它实际上并没有回答问题,但由于声誉不足,StackOverflow 不会让我......)

于 2019-09-23T06:01:54.620 回答
0

你没有提供足够的信息。如果该行是发生 NullPointerException 的位置,则唯一的可能性是 myRepository 为 null,或者 existingObject 为 null。但是,NullPointerException 可能是由于保存中的某些内容而发生的。将代码包装在 try catch 中,并将异常堆栈跟踪记录到文件中。

如果需要,请在此处查看日志记录自定义说明:

于 2013-11-14T13:56:41.443 回答