我需要具有“FriendRequest”和“ListOfFriends”功能。类似于facebook,它显示了接收到的 friend 请求的数量和已批准的 friend 的数量。
通过“FriendRequest”,我的意思是拥有用户收到的 friend 请求的列表。
通过“ListOfFriends”,我的意思是拥有用户的 friend 列表。
为此,我定义了以下类,但是当我尝试使用其用户名检索用户时,将引发“Stackoverflow”异常消息。似乎进入了一个不确定的循环。
当我从toString
方法中删除“FriendRequests”和“Friends”时,它将停止引发异常。
This question与我将要实现的目标相似,但区别是我没有什么需要单独的Credential类。
成员(member)
@Entity
public class Member implements Serializable {
@Id
@GeneratedValue
private long id;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String fname;
@Column(nullable = false)
private String lname;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "requester")
private Set<Friendship> friendRequests = new HashSet<Friendship>();
@OneToMany(fetch = FetchType.EAGER, mappedBy = "friend")
private Set<Friendship> friends = new HashSet<Friendship>();
getters and setters
@Override
public String toString() {
return "Member [
.....
, fname=" + fname + ", lname=" + lname
// + friendRequests.size() + ", friends=" + friends.size() +
"]";
}
}
友谊
@Entity
public class Friendship implements Serializable {
@Id
@ManyToOne
@JoinColumn(referencedColumnName = "username")
Member requester;
@Id
@ManyToOne
@JoinColumn(referencedColumnName = "username")
Member friend;
@Temporal(javax.persistence.TemporalType.DATE)
Date date;
@Column(nullable = false)
boolean active;
最佳答案
我想建议数据库设计。
现在,按照POJO类,您正在拥有一个友谊表和friends表。
取而代之的是,您只能拥有带有一列 boolean 值isAccepted;的友谊表(在POJO类中是变量)。
如果 boolean 值是true,则表示该成员( friend )是 friend 。
当您想获得所有 friend 时,将isAccepted设置为true检索友谊行。
如果只想获取friendrequests(或待批准的待处理请求),则将isAccepted设置为false的所有行。
使用当前的DB设计或ER模型。您需要从友谊表中删除该行(因为它不再是一个好友请求),如果此人接受了好友请求并存储在某个地方。你在哪里存放 friend 。
根据您当前的设计,它存储在friends表中。但是没有一栏说明该行表示某人的 friend 。就像每当一个成员接受另一成员的请求时,在friends表中添加一行(friend),并产生多余的行。