最近、@ManyToOne / @OneToMany リレーションの JPA とクエリで問題が発生し、スタックオーバーフローが発生しました。ただし、これは、エンティティが作成されてからアプリケーション サーバーが再起動された場合にのみ発生します。
問題: 通常、war ファイルをデプロイしてアプリケーション サーバーを起動すると、データベースに何らかのコンテンツを入力して、何があってもクエリを実行できます。ただし、データベースをクリアせずにサーバーを再起動し、同じクエリを実行しようとすると、奇妙な動作が発生します。
Stackoverflow 例外が発生します。
java.lang.StackOverflowError
at java.lang.StringBuffer.append(StringBuffer.java:224)
at java.io.StringWriter.write(StringWriter.java:84)
at java.io.StringWriter.append(StringWriter.java:126)
at java.io.StringWriter.append(StringWriter.java:24)
at com.google.gson.stream.JsonWriter.beforeValue(JsonWriter.java:610)
at com.google.gson.stream.JsonWriter.open(JsonWriter.java:317)
at com.google.gson.stream.JsonWriter.beginObject(JsonWriter.java:300)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:190)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:879)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
[...]
完全を期すために: 私のエンティティには次の関係があります。
ミッション エンティティ:
@OneToMany(mappedBy = "mission", cascade=CascadeType.ALL)
private Collection<Mission2Mission> children;
@OneToMany(mappedBy = "parent", cascade=CascadeType.ALL)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
private Collection<Mission2Mission> parents;
Mission2Mission エンティティ:
@ManyToOne
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
private Mission parent;
@ManyToOne
private Mission mission;
これは、親が自分の子を知っていること、またはその逆であることを意味しますが、親が除外されるため、retentionPolicy を使用して少なくとも典型的な GSON Stackoverflow を回避する必要があります。
この問題全体が JPA と GSON のどちらに関係しているのかはわかりませんが、本当に疑問に思うのは、なぜこれがサーバーの再起動後にのみ発生するのかということです。これはある種のセッションの問題を示しています。私には理解できず、この特定の問題に関する他のスレッドや問題が見つからなかったので、ここで質問します。
lazy およびeager fetch タイプがあることは知っていますが、それらを使用しても、サーバーの再起動時にのみこの問題が発生する理由は説明できません。
どうもありがとう、ケイ