我们最近遇到了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太所有的关系只是为了安全起见:不工作:( –