我需要具有“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),并产生多余的行。

10-08 05:43