我用 Spring Boot 编写了一个 Web 服务,使用 spring data jpa 进行持久化。 Web 服务有一些静态对象(在 Singleton Bean 中),需要定期备份到我的数据库。
有时! (这很糟糕......我真的不知道会发生什么)当我打电话时
ObjectType更新= myRepository.save(existingObject)
我得到一个 java.lang.NullPointerException - 没有可用的堆栈跟踪,因为执行此操作的方法是通过 @Scheduled 运行的。 我尝试调试,并发现existingObject似乎绝对没问题。仅当现有对象实际上不是新对象时(即当 id != 0 时),才会发生该错误
附注我正在使用 Spring Boot,因此并没有真正使用 EntityManager。我只使用@Autowired myRepository。
最佳答案
我看到类似的事情正在发生。在保存期间,似乎从数据库重新获取对象(也许是为了查看哪些字段被更改?),但未加载 ManyToOne 关系(即使 FetchType 显式设置为 EAGER)。 由于某种原因,对关系调用了compareTo。相关对象不为空,但仅填充了其 ID(大概是因为从数据库获取的对象中可用)。所有其他字段均为空。 当compareTo执行它的操作时,会出现NullPointerException。
至于实际的解决方案,我还不知道,因为我希望 FetchType EAGER 确保关系已加载。希望这可以帮助人们进一步找到根本原因。
(我会将此添加为评论,因为它实际上并没有回答问题,但由于声誉不足,StackOverflow 不会让我这样做......)
关于Spring Data JPA save() 抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19978220/