我有一个多对多的关系,链接表有一个额外的字段。因此,根据以下教程,关系是通过2个一对多关系完成的:
我有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正在制作大量的select语句。请注意,数据库只包含1个关联,例如。 1种含2种结构的化合物。看起来hibernate进入无限循环。
我在http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa/上也见过这个解决方案,但是你如何更新呢?
答案 0 :(得分:3)
我的解决方案是在拥有方使用FetctType.EAGER,在子端使用FetchType.Lazy,在链接表中使用2 ManyToOne关系。像这样我可以从拥有方加载而不会得到LazyInitializationException并且mergign按预期工作。
答案 1 :(得分:0)
我是SpaceTuckker的第二个回答。我不认为Persist和merge是一样的。合并将在持久化之前加载对象。坚持不。所以当你调用merge IMHO时,它需要加载惰性关系。如果你打电话坚持,它就不会。
您也可以使用@ElementDependent将相关的@OneToMany关系标记为依赖于另一个表。这是我通过连接表中的其他列解决了“多对多”关系的方式。