2012-03-29 8 views
1

Я использую:JPA один ко многим/многие ко многим примеру

  • Hibernate
  • 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, и я последовал этой инструкции, генерируя таблицы базы данных из объекта (свойство спящего режима). Но в этом примере, когда я загружаю своего друга А, у меня есть список с Friend B и когда я загружаю B, у меня нет пользователя A в список.

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

+0

Можете ли вы привести пример кода, как вы разработали классы сущностей? – magomi

+0

Я копирую прямо из: http://stackoverflow.com/questions/1831186/many-to-many-on-the-same-table-with-additional-columns от Arthur Ronald FD Garcia – CeccoCQ

ответ

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; 
} 
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; 

} 

Когда список друзей или вы могли бы перечислить дружбу -по они являются еще одним table- или друзьями с помощью этот стол. Однако это немного сложно, если вы хотите перечислить только друзей, но не так сложно. Вы могли бы иметь 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; 

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

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

+1

У одного человека может быть много друзей - это отношения 1-Много. Как происходит изменение через промежуточную таблицу? Это все еще 1-много ... Мне также интересно, как вы храните (скажем) адреса - несколько ppl могут жить по одному адресу, а один человек может иметь несколько адресов - без использования отношений Many-Many? Разве я не понял ваш вступительный абзац? – Basic

+0

Да, конечно .. Например, если у пользователя есть другой друг, то это означает новую запись в таблице Друзей. Поэтому у каждой дружбы есть запись в таблице дружбы.Вы можете реализовать несколько адресов нескольких человек, не используя отношения «многие ко многим». Фактически в большинстве приложений в качестве текущего адреса нужен только один адрес. Таким образом, у вас есть таблица пользователей и адресов в таблице «много-к-одному» для таблицы адресов пользователей, поэтому у вас есть несколько пользователей по одному адресу. Однако, если вам нужно несколько пользователей по нескольким адресам, вам нужна таблица useraddress, у которой есть user_id, address_id, поэтому теперь у вас может быть то, что вам нужно. – huzeyfe

+0

Согласны, адрес не был отличным примером, и обычно это 1-Много, но то, что вы описали с таблицей, содержащей 'user_id' и' address_id' _is_, многие отношения, как я понимаю (и в соответствии с [ Википедия] (http://en.wikipedia.org/wiki/Many-to-many_%28data_model%29)). – Basic

Смежные вопросы