当前位置: 首页 > 知识库问答 >
问题:

JPA多对多单向关系

骆照
2023-03-14

假设我们有两个实体,EntityNode和EntityCluster群集有多个Nodes。节点可以属于多个集群。因此,在Cluster中有一个@ManyToMany注释。但是,节点不知道它所属的任何Cluster[有意的]。

当我删除一个Cluster时,我想保留它拥有的所有Node(将来我可能会将这些Node添加到另一个Cluster)。所以我不需要Cascade.DELETE。但是如果我删除一个Node,它所属的所有Cluster都应该更新(Node将从其中删除)。

使用JPA处理此问题的最佳方法是什么?


共有3个答案

广晔
2023-03-14

我对这个线程已经太迟了,但是我在Spring Boot 2.4中遇到了类似的问题。我有2个ManyTo从父实体到同一个子实体的单向关系。

我最终会得到少1或2个实体关系保存在连接表中。

然后我意识到我错过了一个实体/pojo最基本的东西——覆盖hashCode和equals方法!

一旦我添加了这些,Hibernate就开始按预期运行。

薛枫
2023-03-14

事实上,在单向关系中,可以使用`Cluster类中@ManyToMany注释中的joinColumn=“clusterId”property指定关系的持有者实体。

您的代码应该是这样的:

@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单向和双向

壤驷承
2023-03-14
匿名用户

这是因为< code >节点不知道它所属的任何< code >群集。

如果您使用双向关系,您必须选择哪一方将更新NodeCluster之间的链接。从您的业务角度来看,选择最重要的实体…要保存关联,您需要保存关系的拥有实体。

如果你不想要双向关系,你需要删除节点从所有Cluster.nodes之前删除节点本身…

 类似资料:
  • 我有两个类:< code>User和< code>UserProfile。 用户类别: 用户配置文件类: 当我使用此代码时,我在具有多对多关系的表用户配置文件中获得重复的实体。我使用 函数来保存对象。我做错了什么? 然后我删除 cascadeType,出现错误:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。 Hibernate日志:

  • 问题内容: 我有一个设置,其中猫可以由许多所有者拥有,每个所有者可以拥有几只猫。鉴于此,我想写一个说明来帮助我找到具有给定主人姓名的所有猫。 这是一个简单的类设置。 *为简洁起见,没有getters / setter。id字段在超类中。 *为简洁起见,没有getters / setter。id字段在超类中。 这是一个存储库,其中包含有效的查询和无效的规范。 请帮我写规范。 我遇到的麻烦是,这种关系

  • 问题内容: 我在Java中有2个POJO类,Answer和Collaborator,具有多对多关系。 类有一套,但没有一套。我需要在Hibernate中进行的工作是找到合作者,以获得id给出的答案。 我已经使用结果转换器使用Hibernate ()进行了此操作,但是在使用时我陷入了困境,因为我没有要提供给联接的答案列表。 问题答案: 完成了,终于… 这是代码:

  • 问题内容: 我试图保持一个非常简单的单向一对多关系,但是EclipseLink(2.3.1)失败。 服务等级(家长): 参数类(子级):( 当然,数据库中有“ service_id”外键字段,由于它是单向关系,因此未在类中表示)。 这是实体持久性的代码: 我得到这个异常: 编辑:由于数据的性质,数据库字段具有(并且应该具有)非空约束。 这是错误还是代码有问题? 问题答案: 尝试删除参数表的serv

  • 我试图持久化一个非常简单的单向一对多关系,但EclipseLink(2.3.1)失败了。 服务类(父级):

  • 我有一个设置,猫可以由许多主人拥有,每个主人可以拥有几只猫。有鉴于此,我想写一个规范来帮助我找到所有拥有给定主人名字的猫。 下面是一个简单的类设置。 *简洁性方面没有获得者/接受者。Id字段位于超类中。 *简洁性方面没有获得者/接受者。Id字段位于超类中。 这是一个存储库,其中有一个有效的查询和一个无效的规范。 请帮我写一下说明书。 我遇到的问题是,这种关系似乎需要与这种关系的表达方式背道而驰:主