Hibernate:在 ***Error 中与多对多结果合并

Posted

技术标签:

【中文标题】Hibernate:在 ***Error 中与多对多结果合并【英文标题】:Hibernate: merge with many-to-many results in ***Error 【发布时间】:2012-09-28 09:09:04 【问题描述】:

如果链接表有一个附加字段,我有一个多对多的关系。因此,根据以下教程,该关系是通过 2 个一对多关系完成的:

http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/comment-page-1/#comment-122181

我有 2 个实体,第三个实体定义了链接表并由 @Embeddable ID 字段组成。

关系定义为:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.compound", cascade = CascadeType.ALL)

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.structure", cascade = CascadeType.ALL)

是 pk = @Embeddable ID 字段。插入和删除工作正常但是当我打电话时

session.merge(compound);

我得到一个 ***Error 并且日志显示 hibernate 正在制作大量的选择语句。请注意,数据库恰好包含 1 个关联,例如。 1 个化合物包含 2 个结构。看起来hibernate进入了一个无限循环。

我也在 http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa/ 上看到过这个解决方案,但是你如何更新这个解决方案?

【问题讨论】:

也许您正在通过多对多关系加载完整的多对多表。想象一下A1 引用B1B1 引用 A1A2A2 引用 B2。等等。每次从关系的一侧切换到另一侧时,您都会获得一个额外的堆栈级别。 持久化和加载工作,但调用合并时出现问题。 @SpaceTrucker,不过合并应该管理之前合并子操作访问的实体。初学者_请您与测试用例分享您的完整实体,以便我们更好地帮助您。 【参考方案1】:

我的解决方案是在拥有端使用 FetctType.EAGER,在子端使用 FetchType.Lazy,并在链接表中的 2 个 ManyToOne 关系中使用。像这样,我可以从拥有方加载而不会让 LazyInitializationException 和 mergign 按预期工作。

【讨论】:

【参考方案2】:

我赞同 SpaceTuckker 的回答。我不认为 Persist 与合并相同。合并将在持久化之前加载对象。坚持不行。因此,当您调用 merge 恕我直言时,它需要加载惰性关系。如果你调用persist它不会。

您也可以使用@ElementDependent 将相关的@OneToMany 关系标记为依赖于另一个表。这就是我解决连接表中附加列的多对多关系的方法。

【讨论】:

是的,但是让实体工作。所以我可以坚持并在完全不同的会话中加载它并且没有问题。该问题仅在合并时发生。解决方案原来是在 Embeddable ID 类中的 ManyToOne 关系中添加 fetch = FetchType.LAZY。

以上是关于Hibernate:在 ***Error 中与多对多结果合并的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的集合一对多与多对一

hibernate关联总结

hibernate笔记

Hibernate框架--对象的状态,缓存, 映射

如何在 prisma 中使用 connectOrCreate 与多对多

markdown 挑战09:KnexJS与多对多