我們最近遇到了JPA和查詢@ManyToOne/@OneToMany關係的問題,導致產生一個計算器。但是這隻發生在應用服務器由於已經創建實體而重新啓動的時候JPA + GSON:僅在服務器重新啓動後纔會在Stackoverflow中查詢
問題: 當我通常在部署了war文件的情況下啓動我的應用服務器時,我可以用我的數據庫填充一些內容並查詢它是否有什麼關係。 然而,當我重新啓動服務器,但不清除數據庫,我嘗試執行相同的查詢,我得到怪異的行爲:
我得到一個異常#1:
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;
這意味着,父母知道自己的孩子,反之亦然,但至少典型GSON#1應該使用的RetentionPolicy避免,因爲父母被排除在外。
我不知道這整個問題是否與JPA或GSON有關,但真正讓我懷疑的是,爲什麼這隻發生在服務器重新啓動後。它表明會出現某種會話問題,我找不出來,在這個特定問題上我還沒有發現任何其他線程或問題,所以我只是在這裏問。
我知道有懶惰和渴望的獲取類型,但使用它們不會解釋,爲什麼這個問題只出現在服務器重新啓動。
非常感謝, 凱
添加fetchType.LAZY太所有的關係只是爲了安全起見:不工作:( –