gpt4 book ai didi

java - JPA+GSON : Queries result in Stackoverflow only after server restart

转载 作者:行者123 更新时间:2023-11-29 05:38:43 26 4
gpt4 key购买 nike

我们最近遇到了 JPA 问题和 @ManyToOne/@OneToMany 关系的查询,导致计算器溢出。但这只会在实体创建后重新启动应用程序服务器时发生

问题:当我通常在部署了 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;

这意味着, parent 了解他们的 child ,反之亦然,但至少应该通过使用保留策略来避免典型的 GSON Stackoverflow,因为 parent 被排除在外。

我不知道这整个问题是否与 JPA 或 GS​​ON 有关,但真正让我想知道的是,为什么这只发生在服务器重新启动后。它表示某种 session 问题,我无法弄清楚,也没有找到任何其他线程或关于此特定问题的问题,所以我只在这里问。

我知道有懒惰和急切的获取类型,但使用它们无法解释为什么这个问题只在服务器重启时出现。

非常感谢,凯

最佳答案

GSON 不支持循环,所以这很可能是你的原因。我认为在 GSON 中避免循环的正常方法是使变量成为 transient ,我没有听说过 @Retention(RetentionPolicy.RUNTIME) 工作,也许它确实......

你可能没有维护你的双向关系(这是非常错误的),所以在你清除共享缓存之前不要有循环。

您也可以尝试禁用缓存,或禁用编织以缩小问题范围。

您可能想尝试其他 JSON 序列化程序,例如 EclipseLink Moxy,它使用 JAXB 注释并支持循环。

这里有一个例子,http://java-persistence-performance.blogspot.com/2013/08/optimizing-java-serialization-java-vs.html

关于java - JPA+GSON : Queries result in Stackoverflow only after server restart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18507448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com