Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:StackOverflowException记录多个关联_Java_Hibernate_Jpa_Many To Many_Stack Overflow - Fatal编程技术网

Java Hibernate:StackOverflowException记录多个关联

Java Hibernate:StackOverflowException记录多个关联,java,hibernate,jpa,many-to-many,stack-overflow,Java,Hibernate,Jpa,Many To Many,Stack Overflow,在org.hibernate.loader上激活调试日志后,当hibernate尝试记录类似“loading collection[com.Bar#42]”的内容时,我出现了StackOverflowException 重复的堆栈如下所示: at com.Quz.toString(Quz.java:120) at org.hibernate.type.descriptor.java.AbstractTypeDescriptor.extractLoggableRepresentation(Abst

org.hibernate.loader
上激活调试日志后,当hibernate尝试记录类似“loading collection[com.Bar#42]”的内容时,我出现了StackOverflowException

重复的堆栈如下所示:

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)
通常,我在保存集合的对象上执行toString,hibernate尝试记录集合加载,这将调用对象上的toString,依此类推

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

@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;
}
@实体
@表(uniqueConstraints=@UniqueConstraint(columnNames={“fooId”,“barId”}))
公开课{
@身份证
@生成值
保护长id;
受保护字符串fooId;
@许多酮
@JoinColumn(name=“barId”)
受保护钢筋;
@许多
@JoinTable(name=“quz_fum”,JointColumns={
@JoinColumn(name=“fooId”,referencedColumnName=“fooId”),
@JoinColumn(name=“barId”,referencedColumnName=“barId”)},
反向连接列={
@JoinColumn(name=“fumId”,referencedColumnName=“fumId”)}
受保护名单;
}
当joinColumns由主键(hibernate只记录其id)组成时,它可以工作,因此我认为问题是由JoinTable中有非主键列(hibernate尝试记录整个对象)这一事实造成的

这是一个bug还是一个被禁止的连接表

谢谢

我使用的是hibernate版本3.6.0.Final

编辑:

toString方法中没有错误。我确信这一点。 首先,我们可以看到,在堆栈中,递归调用与休眠调用之间没有任何中间层。toString调用hibernate,后者调用相同的toString。 第二,当hibernate日志记录关闭时,toString工作正常。当我打开它时,会出现异常。 第三,我已经调试了足够长的时间来定位这个问题:hibernate调用对象本身的toString,而不是使用特定的ManyToMany设置调用其id


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

您似乎有以下类似的设置:

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 + '}';
    }

}

你根本不能有这样的
toString
方法-你需要决定一方打印收藏,另一方不打印。

Post
Quz#toString()
Fum#toString()
code!!假设这两个方法之间存在递归循环..不,禁止使用调用
parent.toString
toString
调用
child.toString
。这只会导致无限循环。将您的
toString
修复为
parent
child
@boristeider您这里的
child
parent
是什么意思??请给出一个简短的解释。我建议您将您的多人模式转换为一人模式,并与映射的中产阶级实体建立多人模式关系。请参见编辑。当关闭hibernate日志记录时,代码中没有无限循环。
bar.toString
foos.toString
foo.toString
bars.toString
bar.toString