2008-12-28 67 views
3

我试图弄清楚这个问题并且围绕许多人搜索类似的问题搜索相当长的一段时间。休眠:映射社交网络中的用户 - 朋友关系

我试图在社交网络中使用Hibernate模拟用户,还有什么比映射友谊关系更基础的社交网络? 系统中的每个用户都应该有它的朋友列表,我认为这可能是一项非常简单的任务(只需使用ManyToMany关系,对吧?)。所以,我继续尝试以下操作:

@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="userid") 
    protected Long id = null; 
    @ManyToMany 
    protected List<User> friends = null 
} 

现在的问题是,它告诉我,我用多对多误将其朋友之间没有明显的区别,并结识。到目前为止这么好,我得到了错误,但我怎么能做我想要的?

任何想法?我已经达到了我的智慧。

回答

1

关于多对多的事实是,它需要多一点配置,因为它迫使Hibernate生成关系表。 试试这个:


@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="userid") 
    protected Long id = null; 
    @ManyToMany 
    @JoinTable(name = "user_friends", 
     joinColumns = @JoinColumn(name = "user_id"), 
     inverseJoinColumns = @JoinColumn(name = "friend_id")) 
    protected List friends = null; 
    @ManyToMany(mappedBy = "friends") 
    protected List befriended = null; 
} 
 

希望工程=)

编辑:另外,要非常小心取出类型...您可以输入一个用户获取外的控制回路,并让所有的DB 。

+0

我可以只与朋友做一个名单,哪里会成为朋友,结识朋友?在课堂上要列出什么? – dikkini 2014-07-02 21:35:04

1

ManyToMany注释具有mappedBy参数。我猜想像

@ManyToMany(mappedBy = "friends") 

可能工作。无论如何,请参阅docs

编辑:

看来,如果一个多对多的关系需要从两端进行访问。目前你只能从一端访问。也许你应该添加其他关系以及:

@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="userid") 
    protected Long id = null; 
    @ManyToMany 
    protected List<User> friends = null; 
    @ManyToMany(mappedBy = "friends") 
    protected List<User> befriended = null; 
} 

如果不工作,你总是可以推出表示两个用户之间的关系,一个单独的类,并让每个用户有这样的类的实例的集合。

0

好点,其实我试过了。问题是,我接着对关系两侧的mappedBy属性提出了投诉,这是真的,但是无效。 我想知道一个简单的@ManyToMany与一些聪明的自定义查询来获取朋友可能是一个解决方案: ManyToMany会生成一个连接表user_idfriend_id,但查询将匹配任何一个字段,返回所有匹配的用户要么是friend_id要么是user_id即是。 任何想法?

0

这当然是一个很好的解决方案,但我还没有完全销售。基本上,为了得到朋友,我不得不合并这两个集合,这是非常不满意的。

在hibernate中是否绝对没有办法创建幂等的自反关系?

0

我今天也有同样的问题。

@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="userid") 
    protected Long id = null; 
    @ManyToMany 
    protected List<User> friends = null 
} 

应该没问题,我用了类似的结构。不过,我得到了延迟加载异常,并且在将fetchType设置为EAGER时,我收到了有关递归初始化包的问题。

我如何固定我的问题:在查询中使用,以获取“用户”,这样做:

from User as u left join fetch u.friends 

这将初始化的朋友该实体的名单。不过要注意的是,它并没有初始化来自这些朋友的任何朋友。实际上这是一件好事。