我有2个SQL表,“节点”和“边缘”。
“节点”表具有一个复合主键,该主键由两列组成:“ id”和“ 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';
如何建立这种关系?
必须强制为单个@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());
}
}