7

我有一个多对多的关系,链接表有一个附加字段。因此,根据以下教程,该关系是通过 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);

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

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

4

2 回答 2

3

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

于 2012-10-09T12:40:09.510 回答
0

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

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

于 2012-10-08T13:23:55.337 回答