Spring Data JPA save() выдает NPE

Я написал веб-сервис с весенней загрузкой, используя весенние данные jpa для сохранения. В веб-сервисе есть некоторые статические объекты (в Singleton Bean), для которых необходимо регулярно создавать резервные копии в моей базе данных.

Иногда! (Это отстой... я действительно не знаю, что происходит) когда я звоню

ObjectType updated = myRepository.save(existingObject)

Я получаю java.lang.NullPointerException - без пригодной для использования трассировки стека, поскольку метод, выполняющий это, выполняется через @Scheduled. Я попытался отладить, и с существующим объектом все в порядке. Ошибка возникает только тогда, когда существующий объект на самом деле НЕ является новым объектом (т.е. когда id != 0)

P.S. Я использую Spring Boot, поэтому на самом деле не использую EntityManager. Я использую только @Autowired myRepository.


person Alex    schedule 14.11.2013    source источник
comment
У меня есть подозрение, что метод резервного копирования @Schedule может на самом деле попытаться вызвать myRepository.save(), в то время как существующий объект может иметь поля, которые являются нулевыми, но не должны быть. Тем не менее... это странно.   -  person Alex    schedule 14.11.2013


Ответы (2)


Я наблюдаю нечто подобное. Во время сохранения кажется, что объект повторно извлекается из БД (возможно, чтобы увидеть, какие поля были изменены?), но связь ManyToOne не загружается (даже если FetchType явно установлен в EAGER). По какой-то причине для отношения вызывается compareTo. Связанный объект не является нулевым, но его идентификатор заполнен только (предположительно, потому, что он был доступен в объекте, который был извлечен из БД). Все остальные поля пустые. Когда compareTo делает свое дело, следует исключение NullPointerException.

Что касается фактического решения, я еще не знаю, так как ожидал, что FetchType EAGER загрузит отношения. Надеюсь, это поможет кому-то найти основную причину.

(Я бы добавил это как комментарий, поскольку на самом деле он не отвечает на вопрос, но StackOverflow не позволяет мне из-за недостаточной репутации...)

person JayVeeInCorp    schedule 23.09.2019

Вы не предоставили достаточно информации. ЕСЛИ в этой строке возникает исключение NullPointerException, то единственные возможности заключаются в том, что myRepository имеет значение null или существующий объект имеет значение null. Однако возможно, что NullPointerException происходит в результате чего-то в сохранении. Оберните код в try catch и запишите трассировку стека исключений в файл.

При необходимости ознакомьтесь с примечаниями по настройке ведения журнала здесь:

person kaliatech    schedule 14.11.2013