Persistence 持久化具有双向关系的实体时的StackOverflower错误

Persistence 持久化具有双向关系的实体时的StackOverflower错误,persistence,eclipselink,jpa-2.0,Persistence,Eclipselink,Jpa 2.0,我有两种实体,它们之间有双向的多个关系。我不想在这里发布他们的结构,因为我认为这不会有帮助。该关系中的任何更改都没有帮助,但是关系注释如下 // relation in the first entity class @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "Entity1_Entity2", joinColumns = { @JoinColumn(name = "entity1") },

我有两种实体,它们之间有双向的多个关系。我不想在这里发布他们的结构,因为我认为这不会有帮助。该关系中的任何更改都没有帮助,但是关系注释如下

// relation in the first entity class
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "Entity1_Entity2",
                joinColumns = { @JoinColumn(name = "entity1") },
                inverseJoinColumns = { @JoinColumn(name = "entity2") })
private List<Entity2> subEntities = new ArrayList<>();

// relation in the second entity class
@ManyToMany(mappedBy = "relatedEntities", fetch = FetchType.LAZY)
private List<Entity1> owningEntities = new ArrayList<>();
正如您在上面的注释中所看到的,我已经删除了级联持久化,因为我可以想象这导致了递归的深度。但我又犯了这个错误。当我增加允许的堆栈时,它会再次工作,但在我看来,问题并没有解决。但它告诉我,递归不是无止境的。此外,该错误仅因双向关系而发生,因为当我将其设置为单向时,不会抛出is。

所以问题是:当更多的实体被持久化时,为什么递归深度会增加?在不使关系单向的情况下,如何避免这种情况?

它是否编译?列表和哈希集不兼容。哦。。。不,当然你是对的,它不会编译,那是一个打字错误。现在是对的
Exception in thread "main" java.lang.StackOverflowError
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.extractPrimaryKeyFromObject(ObjectBuilder.java:3011)
at org.eclipse.persistence.internal.sessions.AbstractSession.getCacheKeyFromTargetSessionForMerge(AbstractSession.java:2702)
at org.eclipse.persistence.internal.sessions.MergeManager.getTargetVersionOfSourceObject(MergeManager.java:196)
at org.eclipse.persistence.internal.queries.ContainerPolicy.createWrappedObjectFromExistingWrappedObject(ContainerPolicy.java:728)
at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1648)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4132)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeChangesIntoObject(ObjectBuilder.java:4065)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfWorkingCopyIntoOriginal(MergeManager.java:839)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfWorkingCopyIntoOriginal(MergeManager.java:698)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:309)
at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1638)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4132)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeChangesIntoObject(ObjectBuilder.java:4065)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfWorkingCopyIntoOriginal(MergeManager.java:839)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfWorkingCopyIntoOriginal(MergeManager.java:698)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:309)
at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1638)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4132)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeChangesIntoObject(ObjectBuilder.java:4065)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfWorkingCopyIntoOriginal(MergeManager.java:839)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfWorkingCopyIntoOriginal(MergeManager.java:698)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:309)
at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1638)
...