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

如何从非拥有方保存具有双向关系的实体?

尤钱明
2023-03-14

如果节点是使用Spring数据/JPA的拥有方,用双向关系表示下表的最佳方式是什么?我希望能够使用node\u node保存节点,并保存node\u node

节点表

  • 身份证

node_node表

>

节点标识2

这是我到目前为止所拥有的。以NodeNode为拥有方的双向关系,这意味着当我在节点的父节点子节点中创建、更新或删除一个元素时,它将不会被持久化。当我通过添加到父节点子节点来更新节点时,它似乎起作用,但当我通过删除来更新时,它不起作用。我需要通过NodeNode保存,因为它是拥有方,但这太麻烦了,因为它需要保存到NodeNodeNode

public class Node {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<NodeNode> parents;

    @OneToMany(mappedBy = "child", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<NodeNode> children;

}

public class NodeNode {

    @ManyToOne
    @JoinColumn(name = "node_id_1")
    private Node parent;

    @ManyToOne
    @JoinColumn(name = "node_id_2")
    private Node child;

}

目标是能够保存一个Node与任何更改Node.parentsNode.children,并有NodeNode被保存。


共有1个答案

唐信瑞
2023-03-14

最好的解决方案是用manytomy关系替换OneToManymanytomone,并使用Node而不是引用NodeNode

@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.REFRESH,  CascadeType.DETACH })
@JoinTable(name = "node_node", joinColumns = @JoinColumn(name = "node_id_1"), inverseJoinColumns = @JoinColumn(name = "node_id_2"))
private Set<Node> children;

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "children")
private Set<Node> parents;
 类似资料:
  • 首先,这是我的实体。 玩家: 团队: 正如已经说明的许多主题一样,您可以通过Jackson以多种方式避免WebService中的StackOverflow Exeption。 这很酷,除了JPA之外,在序列化之前,所有的实体都可以无限递归地构造另一个实体。这只是丑陋的ans请求需要更长的时间。检查这个截图:IntelliJ调试器 有办法解决吗?知道我希望根据endpoint获得不同的结果。示例:

  • 我在实体“任务”和实体“用户”之间有双向关联。 “任务”定义如下 “用户”的定义是 从两个方向访问关系很好。问题是,一旦定义了“Task”实体,我就无法更新它。 这是一个测试案例 我做错了什么?

  • 在一对多关系中,通常使用@ManyToOne注释的字段是所有者-另一方具有“mappedBy”属性。但是,如果我跳过“mappedBy”并用@JoinColumn(同一列)注释两侧,我可以更新两侧-更改将传播到db。 我没有两个单向关系而不是一个双向关系-只有一个连接列。 没有选择一方作为关系所有者会遇到什么问题? 我的实体看起来类似于以下内容: 它似乎对性能没有任何影响(至少看起来不错),下面是

  • 我有一个实体: 要创建上述实体并将其保存到JPA存储库中,我将执行以下操作: 由于DB中的表存储了候选对象的FK,我认为设置一个id就足够了。但JPA希望我设置候选对象。这迫使我查询候选存储库。 是否需要从候选库中查询候选人以保存,或者如果我有可用的候选人id,我不能直接设置它?

  • 问题内容: 我有两个实体: 我知道和。如果我要序列化的实例,那么它们很好。 但是我还需要传输的实例,并且我想填充该字段。 换一种说法: 在序列化时应该有,但是其父字段可能为空(可以通过使用json参考注释解决)。 在序列化时,它应该带有它们(但不必填充。) 有没有一种使用标准Jackson功能来解决它​​的方法? 即跳过已经序列化的实体的序列化,而不是标记符合或不符合序列化条件的字段。 问题答案:

  • 我想知道Mapstruct是否以及如何帮助映射具有双向关系的ojects(在我的情况下是一对多): 从/映射到实体会产生。(我希望这会发生)。另一方面,封闭的Mapstruct问题469和1163似乎意味着Mapstruct不会直接支持它。我尝试了这个例子: https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-