我有 2 個物體。其中一個是用戶,另一個是關注者。我正在嘗試制作一個像 Twitter 這樣的關注者系統。用戶可以關注另一個用戶,但我想檢查用戶是否關注,不要再這樣做了。
這是我的追隨者物體:
@Entity
public class Followers {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="from_user_fk")
@JsonIgnore
private User from;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="to_user_fk")
@JsonIgnoreProperties({ "password", "balance","id","mail" })
private User to;
public Followers() {};
public Followers(User from, User to) {
this.from = from;
this.to = to;
}
public User getFrom() {
return from;
}
public void setFrom(User from) {
this.from = from;
}
public User getTo() {
return to;
}
public void setTo(User to) {
this.to = to;
}
}
這是服務類:
public ResponseEntity<?> followUser(String username, User user) {
User byUsername = getByUsername(username);
List<Followers> followers1 = byUsername.getFollowers();
List<Followers> collect = followers1.stream().filter(p -> p.getTo().getId().equals(user.getId())).collect(Collectors.toList());
if(followers1.size()>0){
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("e");
}
Followers followers = new Followers();
followers.setFrom(user);
followers.setTo(byUsername);
followersRepository.save(followers);
return ResponseEntity.ok(new GenericResponse("Followed"));
}
public List<Followers> getUserFollowers(String username) {
User byUsername = getByUsername(username);
List<Followers> followers = byUsername.getFollowers();
return followers;
}
如您所見,我獲得了我想要關注的用戶的關注者,并嘗試檢查其是否關注。但我不能。
任何幫助,將不勝感激
uj5u.com熱心網友回復:
您構建的內容非常低效:
- 轉到資料庫并獲取給定用戶的所有關注者。
- 然后檢查這些您要添加的人是否已經存在。
- 如果沒有,請添加它。
- 如果是,請不要執行任何操作或顯示錯誤。
失敗的鯨魚在不久的將來會以這種低效率出現。
有一個非常簡單的方法。只是..添加它!根本不做任何檢查。
您的資料庫應配置為禁止擁有相同的用戶/關注者對,因此如果您在該用戶已經擁有該關注者的情況下嘗試使用該特技,則資料庫將拒絕并拋出例外,表明存在資料庫約束違規。這是您呈現任何錯誤的提示。
請注意,在談論多核架構時,“檢查是否允許 X,如果允許,則執行 X”從根本上說是錯誤的。您忘記了什么:如果用戶“雙擊”“添加關注者”鏈接怎么辦?然后 2 個請求同時開始。他們都檢查 X 是否已經是追隨者(他們不是),然后他們都將 X 添加為追隨者(現在 X 是您不想要的雙重追隨者)。
一般如果涉及到一個DB,在資料一致性和事務支持方面比較好,所以使用最好的工具:一個DB約束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/322712.html
