当前位置: 首页 > 知识库问答 >
问题:

Hibernate:StackOverflowException日志ManyToMany关联

龚奕
2023-03-14
at com.Quz.toString(Quz.java:120)
at org.hibernate.type.descriptor.java.AbstractTypeDescriptor.extractLoggableRepresentation(AbstractTypeDescriptor.java:109)
at org.hibernate.type.AbstractStandardBasicType.toLoggableString(AbstractStandardBasicType.java:291)
at org.hibernate.pretty.MessageHelper.collectionInfoString(MessageHelper.java:307)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2158)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:62)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:627)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1863)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:369)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
at org.hibernate.collection.PersistentBag.toString(PersistentBag.java:506)
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuilder.append(StringBuilder.java:128)
at com.Quz.toString(Quz.java:120)

它附加在单向@manytomany上,如下所示:

@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "fooId", "barId" }))
public class Quz {
    @Id
    @GeneratedValue
    protected Long id;

    protected String fooId;

    @ManyToOne
    @JoinColumn(name="barId")
    protected Bar bar;

    @ManyToMany
    @JoinTable(name = "quz_fum", joinColumns = {
            @JoinColumn(name = "fooId", referencedColumnName = "fooId"),
            @JoinColumn(name = "barId", referencedColumnName = "barId") },
                                 inverseJoinColumns = {
            @JoinColumn(name = "fumId", referencedColumnName = "fumId") })
    protected List<Fum>  fums;
}

当joinColumns由主键组成时(hibernate只记录它的id),所以我认为问题是由我的JoinTable中有非主列引起的(而hibernate试图记录整个对象)。

这是一个bug还是禁止有这样的连接?

toString methodz中没有错误。我敢肯定。首先,我们可以在堆栈中,在递归调用之间没有任何中间,其他hibernate。toString调用hibernate调用相同的toString。第二,当关闭hibernate日志时,toString工作得很好。当我打开它时,异常就出现了。第三,我已经调试了足够长的时间来定位这个问题:hibernate使用特定的ManyToMany设置调用对象本身的toString而不是它的id。

我最初的问题是关于那个设置:允许吗?

共有1个答案

太叔岳
2023-03-14

您似乎有以下类似的东西:

class Foo {

    Collection<Bar> bars;

    @Override
    public String toString() {
        return "Foo{" + "bars=" + bars + '}';
    }

}

class Bar {

    Collection<Foo> foos;

    @Override
    public String toString() {
        return "Bar{" + "foos=" + foos + '}';
    }

}

现在,当我调用bar.tostringfoo.tostring时,我进入了一个无限循环:

bar.toString
foos.toString
foo.toString
bars.toString
bar.toString

您不能使用这样的tostring方法--您需要决定一方打印集合而另一方不这样做。

 类似资料:
  • 应用引擎v2目前提供了四种日志收集方案可供选择 实时日志 日志下载 Splunk日志分析 FDS导入日志 实时日志 实时日志是最常用的方式,可以在应用右上角点击“日志”进入。 实时日志目前支持从当前时间查看和从过去时间查看。 当前时间查看 从点连接按钮的时刻开始查看日志,提供暂停,过滤功能 过去时间查看 可以选择过去的时间点查看,最多支持60分钟。 注意:三个区域的总和才是过去该时间段应用的完整日

  • 我正在开发一个应用程序,使用我的另一个项目作为maven依赖项。 期望 我希望我的依赖项使用自己的回退.xml登录自己的文件。我希望应用程序使用自己的 logback.xml文件登录到控制台和一个与依赖项不同的文件。我希望这两个文件都位于应用程序jar附近的日志文件夹中。 它现在做什么 但是目前,应用程序和依赖项都使用应用程序的logback.xml,所有内容都记录在控制台和同一个文件中。 我该如

  • 在一个项目中,我有以下实体:具有连接到关键字的模板部分的模板。这两种关系都是。一些代码: 然后,我尝试使用给定ID查找与某个模板相关的关键字。我使用使用此谓词执行此操作: 由于某些原因,谓词处理得根本不好。尝试调用方法时出现此错误: 组织.hibernate.hql.internal.ast.QuerySyntax 异常: 模板实体部分目录未映射 [选择关键字身份\nfrom mypackage.

  • 我有一个要求,因为我需要在Mulesoft Flow中关闭日志记录。我需要在记录器级别,如果可能的话,在Http连接器级别。尝试将INFO更改为关闭log4j2.xml文件,但没有运气。我需要更新log4j2.xml文件中的哪些参数才能使其工作。现在我已经做了异步记录器。 提前感谢

  • 请帮忙,我已经三天没有成功了:/ 我正在为Google Cloud Run部署一些服务,并希望在请求通过服务时跟踪请求并将日志与这些请求关联起来。StackDriver在“StackDriver跟踪”中提供了一个很好的平台。我在用谷歌。云我的asp中的诊断库。net核心web api。我能够成功地跟踪请求,启动跨度,并在StackDriver跟踪时间线中查看嵌套在跟踪中的跨度。然而,如何让我的日志

  • 问题内容: 我有一些与关系有关的实体: 和 使用某些模型执行保存模型时,一切正常。表存储这些实体的所有键。但是,使用驱动程序保存模型时,表不会更改。我认为映射存在问题。 问题答案: 那是预期的行为。在双向多对多关联中,一侧必须是反侧。在您的情况下,这是一面,因为它包含: 拥有关系的字段。除非关系是单向的,否则为必需。 这意味着是关联的所有者,并且Hibernate仅在维护关联时检查该侧。