Hibernate / JPA无方向自我参考

时间:2019-01-22 02:43:28

标签: hibernate jpa

说我有PersonFriendship JPA实体。 Friendship在两个人之间,包含诸如他们何时见面,他们的关系类型等信息。

我想从一个Person实例访问涉及该人的所有Friendships 。令人困惑的是,友谊就是我所说的“无方向”关系(不确定正确的词)。人1和人2之间的友谊与人2和人1之间的友谊相同。我是否需要在@OneToMany中拥有两个单独的Person关系,并以某种方式合并它们,还是有更好的方法?

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long personId;

    private String name;

    @OneToMany(mappedBy = "person1")
    private List<Friendship> friendships1;

    @OneToMany(mappedBy = "person2")
    private List<Friendship> friendships2;
}
@Entity
public class Friendship {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    private Person person1;

    @ManyToOne
    private Person person2;

    private Date metOn;

    private String relationshipType;
}

1 个答案:

答案 0 :(得分:1)

有两种方法可以完成此操作,而您选择的哪种方法可能与您要更新关系的方式有关。

您将有一个PERSON表和另一个名为FRIENDSHIP的表。 FRIENDSHIP表将具有两列,以标识涉及的两个人。简而言之,问题在于,如果FRIENDSHIP表中的值是X,Y,那也意味着Y,X。

一种策略是仅将两行之一存储在FRIENDSHIP中,并定义一个规则来确定它是哪一行。规则可能是,X始终必须小于Y,因此,为了在人1和人2之间建立友谊,您必须始终存储1,2,而从不存储2,1。然后,您可以定义两个集合,也可以在FRIENDSHIP之上创建一个类似于SELECT P1,P2 FROM FRIENDSHIP UNION的视图SELECT P2,P1 FROM FRIENDSHIP并具有引用该集合的单个集合。

另一种策略是仅将X,Y和Y,X存储在表中,并在Hibernate插入第一个时使用触发器添加第二个。在这种情况下,您可以只引用两个列之一的单个集合,让Hibernate更新它,并相信数据库可以修复问题,以便从其他人的角度来看集合看起来正确。