JPA一对多/多对多示例

时间:2012-03-29 13:09:15

标签: java mysql sql hibernate jpa

我正在使用:

  • 休眠
  • MySQL的
  • JBOSS

我必须创建一个允许用户建立友谊的应用程序。

我还处于设计阶段,我想拥有这些表格:

- User {_id, name, address} 
 - Friendship {idUserA, idUserB, date}

为了我的目的,我应该与用户建立相互关系。例如1是2的朋友,间接2是1的朋友。 所以在我的表中我认为:

友谊= {1,2,...}

我在问我如何模拟这种行为。我已经阅读了他的主题:Many-to-many on the same table with additional columns并且我遵循了这条指令从实体(hibernate的属性)生成数据库表。但是在这个例子中,当我加载我的朋友A时,我有一个朋友B的列表,当我加载B时,我没有用户A进入列表。

我如何实现这种该死的相互关系?

2 个答案:

答案 0 :(得分:1)

据我所知,这个样本的相互关系并不是隐含的。要从A-> B和B-> A获得友谊关系,您必须在表中添加两个条目,或者必须实现两个集合并返回两个列表的交集:

@OneToMany(mappedBy="myFriends")
private List<MyFriends> myFriends;

@OneToMany(mappedBy="me")
private List<MyFriends> iAmFriendOf;

...

Set<MyFriends> getFriends() {
    Set<MyFriends> friends = new HashSet<MyFriends>();
    friends.addAll(myFriends);
    friends.addAll(iAmFriendOf);
    return friends;
}

答案 1 :(得分:0)

其实我不是OneToMany的忠实粉丝,特别是ManyToMany的关系。我更喜欢像你一样拥有像友谊这样的另一张桌子。所以据我所知,你正在混合方法。对我来说最简单的方法是拥有一个友谊表,在这张表中你需要的只是两个朋友的匹配,所以设计可能是:

@Entity
public class User{

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column
    private String name;

    @Column
    private String address;

}

@Entity
public class Friendship {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @ManyToOne 
    @JoinColumn(name="friend_requester_id")
    private User friendRequester;

    @ManyToOne 
    @JoinColumn(name="friend_accepter_id")
    private User friendAccepter;

    private Date date;

}

当列出朋友时,您可以列出友谊 - 因为他们是使用此表的另一个表或朋友。但是它有点棘手如果你想只列出朋友但不是那么难。您可以使用getFriends(List<Friendship> friendships, int userId)方法并列出以下朋友:

  List<User> friends ...

  Iterator iterator = friendships.iterator();
  while (iterator.hasNext()) {
     Friendship friendship = (Friendship) iterator.next();
     if (friendship.getFriendRequester().getId != userId) {
         friends.add(friendship.getFriendRequester);
     } else {
         friends.add(friendship.getFriendAccepter);
     }
  }

  return friends;

此实施的另一个优点是,您可以区分之后请求成为朋友的人(如果需要)。

在我看来,是的,它看似复杂而且过度劳累,但它相当可维护,而且不那么痛苦。