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 がリレーションシップで呼び出されます。関連オブジェクトは null ではありませんが、ID が入力されているだけです (おそらく、DB からフェッチされたオブジェクトで ID が使用可能だったため)。他のすべてのフィールドは null です。その後、compareTo が処理を実行すると、NullPointerException が続きます。

実際の解決策については、FetchType EAGER がリレーションシップが確実に読み込まれることを期待していたので、まだわかりません。うまくいけば、これは誰かが根本的な原因をさらに見つけるのに役立ちます.

(実際には質問に答えないのでコメントとして追加したはずですが、評判が不十分なためStackOverflowは許可しません...)

于 2019-09-23T06:01:54.620 に答える