JPA-具有条件的OneToMany

问题描述 投票:0回答:1

我有2个SQL表,“节点”和“边缘”。

“节点”表具有一个复合主键,该主键由两列组成:“ id”和“ type”。

“边缘”表包含以下列:

  • node_1_id:边缘的第一个节点的ID
  • node_1_type:边的第一个节点的类型
  • node_2_id:边缘的第二个节点的id
  • node_2_type:边缘的第二个节点的类型

还有两个外键约束将(“ node_1_id”,“ node_1_type”)和(“ node_2_id”,“ node_2_type”)链接到“ node”表的“ id”和“ type”。

我创建了以下jpa实体:

@Entity
@Table(name = "edge")
public class Edge {
    @Id
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "description", nullable = true, length = 100)
    private String description;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "node_1_id", referencedColumnName = "id"),
        @JoinColumn(name = "node_1_type", referencedColumnName = "type")
    })
    private Node node1;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "node_2_id", referencedColumnName = "id"),
        @JoinColumn(name = "node_2_type", referencedColumnName = "type")
    })
    private Node node2;
}

在“节点”实体中,我想创建一个称为“ edges”的“ OneToMany”关系,该关系将获取链接到节点的所有边缘(它是第一个还是第二个节点都没有关系。

这是对应的SQL查询:

select *
from node n join edge e
on (n.id = e.node_1_id and n.type = e.node_1_type) or (n.id = e.node_2_id and n.type = e.node_2_type)
where n.id = 1 and n.type = 'type';

如何建立这种关系?

java hibernate jpa one-to-many
1个回答
0
投票

必须强制为单个@OneToMany关系吗?否则,您可以将对应项添加到两个@ManyToOne关系中,并创建一个仅返回单个合并列表的getter:

public class Node {

    @OneToMany(mappedBy="node1")
    private List<Edge> firstNodeEdges;

    @OneToMany(mappedBy="node2")
    private List<Edge> secondNodeEdges;

    public List<Edge> getEdges() {
        return Stream.concat(firstNodeEdges.stream(), secondNodeEdges.stream())
            .collect(Collectors.toList());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.