【问题标题】:JPA ManyToMany unidirectional relationshipJPA ManyToMany 单向关系
【发布时间】:2016-09-08 05:17:20
【问题描述】:
假设我们有两个实体,实体Node 和实体Cluster。
一个Cluster 有许多Nodes。一个Node 可以属于多个Cluster。所以在Cluster 中有一个@ManyToMany 注释。但是Node 不知道它属于(有意)的任何Cluster。
当我删除Cluster 时,我想保留所有Nodes(将来我可能会将这些Nodes 添加到另一个Cluster)。所以我不需要 Cascade.DELETE。但是如果我删除一个Node,它所属的所有Cluster 都应该更新(Node 将从它们中删除)。
使用 JPA 处理此问题的最佳方法是什么?
【问题讨论】:
标签:
hibernate
jpa
spring-data
hibernate-mapping
【解决方案1】:
这是因为Node 不知道它属于任何Cluster。
如果使用双向关系,则必须选择哪一方将更新Node 和Cluster 之间的链接。选择从业务角度来看最重要的实体...要保存关联,您需要保存关系的拥有实体。
如果您不想要双向关系,则需要先从所有Cluster.nodes 中删除Node,然后再删除Node 本身...
【解决方案2】:
实际上在单向关系中,您可以使用`Cluster 类中的@ManyToMany 注释中的joinColumn="clusterId" 属性指定关系的持有者实体。
这应该是你的代码:
@Entity
@Table(name="Cluster")
public class Cluster {
//Id and properties
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="Cluster_Nodes",
joinColumns={@JoinColumn(name="clusterId")},
inverseJoinColumns={@JoinColumn(name="nodeId")})
private Set<Node> nodes = new HashSet<Node>();
// Getter and Setter methods
}
如需进一步阅读,请查看:
Hibernate @ManyToMany Unidirectional and Bidirectional
【解决方案3】:
我来这个帖子太晚了,但是我在 Spring Boot 2.4 上遇到了类似的问题。我有 2 个从父实体到同一个子实体的 ManyToMany 单向关系。
我最终会在连接表中少保存 1 或 2 个实体关系。
然后我意识到我错过了实体/pojo 最基本的东西 - 覆盖 hashCode 和 equals 方法!
添加这些后,Hibernate 开始按预期运行。