说我有Person
和Friendship
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;
}
答案 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更新它,并相信数据库可以修复问题,以便从其他人的角度来看集合看起来正确。