休眠:在*Error中合并多对多结果

休眠:在*Error中合并多对多结果

问题描述:

我有一个多对多的关系,如果链接表有一个额外的字段。因此,关系根据下面教程2一个一对多关系来完成:休眠:在*Error中合并多对多结果

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和日志显示冬眠正在吨select语句。请注意,数据库只包含1个关联,例如。 1化合物含有2个结构。它看起来像休眠进入无尽的循环。

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

+2

也许你正在通过多对多关系加载你的完整的多对多表。想象一下'A1'引用'B1'。 'B1'引用'A1'和'A2'。 'A2'引用'B2'。等等。随着从关系的一侧到另一侧的每一次切换,您都会获得额外的堆栈级别。 – SpaceTrucker

+0

坚持并加载工作,但在调用合并时出现问题。 –

+0

@SpaceTrucker,但合并应该管理前一个合并子操作访问的实体。 beginner_请您分享您的完整实体与测试用例,以便我们能够更好地帮助您。 –

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

我第二个SpaceTuckker的回答。我认为坚持不是和合并一样。合并会在持久化之前加载对象。坚持不。所以当你调用合并恕我直言,它需要加载懒惰的关系。如果你打电话坚持它没有。

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

+2

是的,但获得实体的作品。所以我可以坚持下去,并在完全不同的会议中加载它,而不是问题。该问题仅在合并时发生。解决方案原来是将fetch = FetchType.LAZY添加到Embeddable ID类中的ManyToOne关系中。 –