与多个连接列的OneToMany关系

时间:2012-05-07 13:53:43

标签: java hibernate jpa bidirectional-relation

我有这个实体Friendship

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

根据友谊,这个实体只有一个实例/记录(不是2个),所以John不是Jane的朋友而不是其他方式的问题。条目也被标准化,因此具有最低ID的友谊的成员是user1,而另一个成员是user2,这意味着我可以通过简单的唯一约束来防止重复条目。

为了获得某个用户的友谊,我使用

执行查询

WHERE user1 = :me OR user2 = :me

是否可以将其映射到@OneToMany Set<Friendship>的{​​{1}}属性?

User还有其他属性,因此这不仅仅是Friendship

2 个答案:

答案 0 :(得分: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();
}

}

我过去这样做的方法是以某种方式对连接表进行反规范化,无论是通过重复列(映射每个方向的关联)还是重复行。要么允许你简化你的提取。

答案 1 :(得分:0)

是的,这是可能的。但为什么你需要@OneToMany?你可以使用@ManyToMany。它会是一样的。在@ManyToMany注释中,您可以指定表,其中将存储id1对user1 - user2。然后只需查询此表。