假设我们有两个实体,即实体Node
和实体Cluster
。
Cluster
有很多Node
个。 Node
可以属于多个Cluster
。所以在Cluster
中有一个@ManyToMany
注释。但是Node
并不知道它属于(有意)的任何Cluster
。
当我删除Cluster
时,我想保留所有Node
(以后我可能会将Node
添加到另一个Cluster
)。所以我不需要 Cascade.DELETE
。但是,如果我删除Node
,则应更新其所属的Cluster
(Node
将从其中删除)。
使用JPA处理此问题的最佳方法是什么?
答案 0 :(得分:3)
那是因为Node
不知道它所属的任何Cluster
。
如果您使用双向关系,则必须选择哪一方更新Node
和Cluster
之间的链接。在业务角度选择最重要的实体...要保存关联,您需要保存关系的拥有实体。
如果您不想要双向关系,则需要先删除所有Node
中的Cluster.nodes
,然后才能删除Node
本身...
答案 1 :(得分:2)
实际上,在单向关系中,您可以使用“Cluster类”中joinColumn="clusterId"
注释中的@ManyToMany
属性指定关系的holder实体。
这应该是你的代码:
@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
}
如需进一步阅读,请查看:
答案 2 :(得分:0)
我对这个线程太晚了,但我在 Spring Boot 2.4 中遇到了类似的问题。我有 2 个从父实体到同一个子实体的多对多单向关系。
我最终会在连接表中少保存 1 或 2 个实体关系。
然后我意识到我错过了实体/pojo 最基本的东西 - 覆盖 hashCode 和 equals 方法!
一旦我添加了这些,Hibernate 就开始按预期运行。