我正在使用Spring Boot和JPA开发一个Web应用程序。我有一个类User,就像在社交网络中一样,可以有关注者和关注者。我认为最好的实现方法是创建一个类(FollowRelationship),其中有两个用户,一个用户跟随,另一个用户跟随。因此,在每个User类中,应该有两个具有不同映射关系的FollowRelatioship对象列表,一个用于关注者,另一个用于以下对象。但是我认为通过查看代码,情况会更清楚。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer userId;
@OneToMany(mappedBy="to", cascade = CascadeType.ALL, orphanRemoval=true)
private List<FollowRelationship> followers = new ArrayList<>();
@OneToMany(mappedBy="from", cascade = CascadeType.ALL, orphanRemoval=true)
private List<FollowRelationship> followings = new ArrayList<>();
...
}
以及FollowRelationship类:
@Entity
public class FollowRelationship {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long followRelationshipId;
private Date date;
@ManyToOne
@JoinColumn(name = "from_id")
@JsonIgnore
private User from;
@ManyToOne
@JoinColumn(name = "to_id")
@JsonIgnore
private User to;
public FollowRelationship(Date date, User from, User to) {
this.date = date;
this.from = from;
this.to = to;
}
...
}
用于创建FollowRelationship的方法如下:
@Override
public void follow(Long followerId, Long followedId) throws UserNotFoundException {
User follower = getByUsername(followerId);
User followed = getByUsername(followedId);
follower.addFollowing(new FollowRelationship(new Date(), follower, followed));
this.userRepository.save(follower);
}
假设我们在数据库中有两个用户,user1和user2。如果我跟随user2和user1,系统将在数据库内部正确创建一个FollowRelationship元组。
date:2020-02-28 14:38:39 from: user1 to: user2
有时认为,当系统从数据库中加载用户时,它会复制一些关注者或某些关注者,但我不明白为什么!那么问题是:我实施的解决方案有问题吗?在某些情况下会产生问题吗?
我看到了似乎在谈论同一问题的问题(Duplicates in OneToMany annotated List),但是我不确定,因为我有一个不同的实现,它只有一个List,在同一个Class上有两个(FollowRelationship)。甚至我还不确定为什么会这样,