Hibernate:在社交网络中映射用户 - 朋友关系

时间:2008-12-28 17:05:08

标签: java hibernate annotations social hibernate-mapping

我已经有一段时间试图弄清楚这个问题了,并且在谷歌上搜索许多人都有类似的问题。

我正在尝试使用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
}

现在的问题是它告诉我,由于朋友和朋友之间没有明确的区别,我错误地使用了ManyToMany。到目前为止这么好,我得到了错误,但我怎么能做我想做的事呢?

有什么想法吗?我已经达到了智慧的终点。

5 个答案:

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

如果这不起作用,您总是可以引入一个表示两个用户之间关系的单独类,并让每个用户都拥有该类实例的集合。

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

希望它有效=)

编辑:另外,要非常小心获取类型...您可以输入用户获取失控循环并获取所有数据库。

答案 2 :(得分:0)

好点,事实上我试过了。问题是我接到关于在关系两侧设置的mappedBy属性的抱怨,这是真的,但是无效。 我想知道一个简单的@ManyToMany有一些聪明的自定义查询来获取朋友可能是一个解决方案: ManyToMany会生成一个包含user_idfriend_id,的联接表,但查询会匹配其中一个字段,并返回匹配friend_id或{{匹配的所有用户1}}就是这样。 有什么想法吗?

答案 3 :(得分:0)

那当然是一个很好的解决方案,但我还没有完全卖掉。基本上,为了得到朋友,我必须合并这两个系列,这是非常不令人满意的。

绝对没有办法在hibernate中创建幂等的,反身的关系吗?

答案 4 :(得分: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

这将初始化该实体的朋友列表。但请注意,它不会初始化这些朋友的任何朋友。实际上这是一件好事。