JPA Один ко многим / Многие ко многим Пример - PullRequest
1 голос
/ 29 марта 2012

Я использую:

  • Hibernate
  • MySQL
  • jBoss

Мне нужно создать приложение, которое позволяет пользователюдружить.

Я все еще на стадии разработки, и я хотел бы иметь следующие таблицы:

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

Для моих целей у меня должны быть взаимоотношения с Пользователями.Например, 1 - друг 2, а косвенно 2 - друг 1. Итак, я думаю, что в моей таблице есть:

Friendship = {1, 2, ...}

Яспрашиваю, как я могу смоделировать это поведение.Я прочитал его тему: Многие ко многим в одной таблице с дополнительными столбцами , и я следовал этой инструкции, генерируя таблицы базы данных из сущности (свойство hibernate).Но в этом примере, когда я загружаю своего друга А, у меня есть список с другом Б, а когда я загружаю BI, в списке нет пользователя А.

Как я могу реализовать эти чертовы взаимоотношения?

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Насколько я понимаю, этот пример не подразумевает взаимность.Чтобы иметь дружеские отношения из 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;
}
0 голосов
/ 29 марта 2012

На самом деле я не большой поклонник отношений 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;

Еще одним преимуществом этой реализации является то, что вы можете различать, кто запросил дружбу позже (если это необходимо).

На мой взгляд, да, это кажется сложным и переутомленным, но это довольно ремонтопригодно и менее болезненно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...