@ManyToMany 关系不保存

Posted

技术标签:

【中文标题】@ManyToMany 关系不保存【英文标题】:@ManyToMany relation not save 【发布时间】:2016-03-26 18:18:12 【问题描述】:

我有一些实体与@ManyToMany 关系:

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "buses_drivers",
        joinColumns = @JoinColumn (name = "driver_id_inner", referencedColumnName = "driver_id"),
        inverseJoinColumns = @JoinColumn (name = "bus_id_inner", referencedColumnName = "bus_id"))
private List<Bus> buses;

@ManyToMany(mappedBy = "buses", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Driver> drivers;

当使用一些Bus 模型执行保存Driver 模型时,一切正常。表buses_drivers 存储这些实体的所有键。但是当使用驱动程序保存Bus 模型时,表格不会改变。我认为inverseJoinColmns 映射有问题。

【问题讨论】:

或者问题出在您的持久性代码中?也许发布它会有所帮助? 【参考方案1】:

这是预期的行为。在双向多对多关联中,一侧必须是相反的一侧。在您的情况下,它是 Bus 一侧,因为它包含 mappedBy

拥有关系的字段。需要除非关系 是单向的。

这意味着Driver 是关联的所有者,Hibernate 只会在维护关联时检查该方。

【讨论】:

【参考方案2】:

您绝对应该重新设计您的关系。

即使没有遇到当前保存场景的问题,使用双向@ManyToMany + CascadeType.ALL,你注定会遇到更多麻烦。

例如,删除一个bus 将由于级联,删除其所有驱动程序,由于再次级联,将删除其所有总线。你基本上最终会删除比你想要的更多的东西。此外,检查这些映射生成的 SQL,您很可能会注意到它远非理想。

【讨论】:

以上是关于@ManyToMany 关系不保存的主要内容,如果未能解决你的问题,请参考以下文章

如何在typeORM中保存@ManyToMany中的关系

Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库

@ManyToMany 保存关系在一个方向上只能使用一次

Symfony2-Doctrine:ManyToMany 关系未保存到数据库

在 typeORM 中的 @ManyToMany 中保存关系会覆盖先前的条目

Spring Jpa Data Repository使用LinkedEntity for ManyToMany关系保存(更新)