2012-05-07 3 views
3

У меня есть эта сущность Friendship:OneToMany связи с несколькими столбцами

@ManyToOne 
private User user1; 
@ManyToOne 
private User user2; 
... and other properties of the friendship 

За дружбу есть только один экземпляр/запись этого объекта (не 2), так что не может быть какими-либо вопросы, где Джон друг Джейн, но не наоборот. Записи также нормализованы, поэтому член дружбы с самым низким ID - user1, а другой член - user2, что означает, что я могу предотвратить запись дубликатов с простым уникальным ограничением.

Чтобы получить дружбу определенного пользователя я выполнить запрос с

WHERE user1 = :me OR user2 = :me.

Возможно ли это нанести на @OneToMany Set<Friendship> объект User?

(Friendship обладает и другими свойствами, так что это не просто @ManyToMany Set<User> friends)

ответ

0

Да, это возможно. Но зачем вам @OneToMany? Вы можете использовать @ManyToMany. Это будет так же. В аннотации @ManyToMany вы можете указать таблицу, в которой будут храниться пары идентификаторов user1 - user2. Затем просто выполните запрос к этой таблице.

+0

Это приведет к восстановлению соединений только в одном направлении (1-> 2). Я считаю, что вопрос заключается в двунаправленности. –

1

Короткий ответ - нет. Для двунаправленной выборки я считаю, что единственный способ сделать то, что вы просите, - это именованный запрос. Что-то вдоль линий:

@Entity 
@NamedQuery(name="User.friendships", query=" 
    select u 
    from User u 
    where u in (
     select f.User1 
     from Friendship f 
     where f.User2.id = :userId 
    ) or u in (
     select f.User2 
     from Friendship f 
     where f.user1.id = :userId 
)") 
public class User { 

private Set<User> friends = new HashSet<User>() 

public Collection<User> getFriendships(Session s) { 
    return s.getNamedQuery("User.friendships") 
     .setParameter("userId", this.id) 
     .list(); 
} 

}

Пути я сделал это в прошлом, является де-нормализует таблицу присоединиться к какому-либо образом, будь то через дублированные столбцы (отображение ассоциации в каждом направление) или повторяющиеся строки. Либо вы сможете упростить выборку.

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